문제

나는 창에 일부 데이터를 표시하는 시각적 C ++ 2008 프로그램을 만들려고 노력하고 있습니다. 나는 읽었다 여러 장소 이를 수행하는 올바른 방법은 WNDPROC를 무시하는 것입니다. 그래서 Visual C ++ 2008 Express Edition에서 Windows Forms 응용 프로그램을 만들었고이 코드를 Form1.h에 추가했지만 컴파일하지는 않습니다.

    public:
    [System::Security::Permissions::PermissionSet(System::Security::Permissions::SecurityAction::Demand, Name="FullTrust")]
    virtual void WndProc(Message %m) override
    {
        switch(m.Msg)
        {
            case WM_PAINT:
            {
                HDC     hDC;
                PAINTSTRUCT ps;
                hDC = BeginPaint(m.HWnd, &ps);

                // i'd like to insert GDI code here

                EndPaint(m.Wnd, &ps);
                return;
            }
        }
        Form::WndProc(m);
    }

Visual C ++ 2008 Express Edition에서 이것을 컴파일하려고하면이 오류가 발생합니다.Error C2664 : 'beginpaint': 'system :: intptr'에서 'hwnd'에서 매개 변수 1을 변환 할 수 없습니다.

m.hwnd 대신이 핸들을 사용하려고하면 동일한 오류가 발생합니다.

m.hwnd를 (hwnd)로 캐스팅하려고하면이 오류가 발생합니다.Error C2440 : 'type cast': 'system :: intptr'에서 'hwnd'로 변환 할 수 없습니다.

어쩌면 나는 m.hwnd를 pin_ptr 또는 무언가로 캐스팅해야 할 수도 있습니다.

도움이 되었습니까?

해결책

원시 Win32 응용 프로그램을 만들고 있다면 해당 기능을 사용할 수 있습니다.

반면에 WinForms 응용 프로그램을 작성하는 경우 OnPaint 이벤트를 무시해야합니다.

  • 설계보기 (양식을 보여주는보기)로 전환하십시오.
  • 양식의 제목 표시 줄을 클릭하십시오
  • 속성 창에서 (기본적으로 오른쪽 하단 화면에서) 상단 근처의 번개 볼트를 선택하십시오. 이벤트 목록이 표시됩니다.
  • 페인트 이벤트를 아래로 스크롤하고 두 번 클릭하십시오.

그래픽 객체의 드로잉 기능을 사용할 수있는 페인트 루틴 쉘로 끝납니다.


private: System::Void Form1_Paint(System::Object^  sender, System::Windows::Forms::PaintEventArgs^  e) 
{
    e->Graphics->DrawRectangle(...)              
}

RAW Win32 코드를 작성하려면 알려 주시면 쉘을 쓰도록 도와 드릴 수 있습니다. 당시 Win32에 관심이 있다면 Charles Petzold의 프로그래밍 Windows 5th Edition을 추천합니다.

C ++ winforms를 배우고 싶다면 ... C# 또는 vb.net으로 전환하는 것이 더 직관적 일 수 있기 때문에 간단히 전환하는 것이 좋습니다.

도움이 되었기를 바랍니다. 건배.

다른 팁

당신이 참조하려는 기사는 Winforms 앱이 아닌 기본 C ++ 응용 프로그램에서 수행하는 방법에 대해 논의합니다. WNDPROC에서 메시지를 처리하는 대신 onpaint 메소드를 무시해야합니다.

WIN32 프로그래밍 (WM_PAINT를 무시해야 함)과 Windows Forms / .NET간에 섞여 있다고 생각합니다. 여기서 드로우 메소드를 무시해야합니다.

양식에 그리기는 .NET에서 매우 단순합니다! onpaint 메소드를 무시한 다음 모든 도면을 수행합니다.

Visual Studio의 도구 상자를 사용하거나 클래스에서 다음 코드를 사용하여 페인트 핸들러에 바인딩 할 수 있습니다.

this.Paint += new System.Windows.Forms.PaintEventHandler(this.MyForm_Paint); 

그런 다음 MyForm_paint 메소드를 구현합니다.

private void MyForm_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
  //create a graphics object from the form
  Graphics g = this.CreateGraphics();

  // create  a  pen object with which to draw
  Pen p = new Pen(Color.Red, 7);  // draw the line 

  // call a member of the graphics class
  g.DrawLine(p, 1, 1, 100, 100);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top