2009-03-13 4 views
3

Window에서 일부 데이터를 표시하는 Visual C++ 2008 프로그램을 만들려고합니다. 나는 variousplaces에서 올바른 방법은 WndProc를 재정의하는 것입니다. 그래서 윈도우 비주얼 C++ 2008 익스프레스 에디션에서 Forms 응용 프로그램을 만들어, 나는 Form1.h이 코드를 추가하지만, 컴파일되지 않습니다 :BeginPaint의 hWnd 매개 변수에 대한 올바른 값은 무엇입니까?

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); 
    } 

내가 비주얼 C++ 2008 익스프레스 에디션이 컴파일 할 때 이 오류가 발생합니다 오류 C2664 : 'BeginPaint 함수': 'HWND'

에 '시스템 :: IntPtr입니다'에서 매개 변수 1 변환 할 수 없습니다 내가 this-를 사용하려고 할 때> 같은 오류 m.HWnd 대신 처리 발생합니다. 나는 (HWND)에 m.HWnd를 캐스팅하려고하면

이 오류가 발생합니다 오류 C2440를 : '형식 캐스트': 어쩌면

'HWND'에서 '시스템 :: IntPtr입니다'에서 변환 할 수 없습니다 I m.HWnd를 pin_ptr 등으로 캐스트해야합니다.

답변

2

원시 Win32 응용 프로그램을 만드는 경우 이러한 기능을 사용할 수 있습니다.

반면에 WinForms 응용 프로그램을 만드는 경우 OnPaint 이벤트를 재정의해야합니다. 디자인보기로

  • 스위치 (양식을 보여줍니다 볼 수 있습니다.) 양식 속성 창에서
  • 의 제목 표시 줄에
  • 클릭 (아마 당신의 오른쪽 화면에 기본 설정)을 선택하십시오 번개가 위쪽에있다. 그러면 이벤트 목록이 표시됩니다.
  • 페인트 이벤트까지 아래로 스크롤하여 두 번 클릭합니다.

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


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

원시 Win32 코드를 쓰고 싶다면 저에게 알려주십시오. 그러면 쉘을 작성할 수 있도록 도와 드리겠습니다. 당분간 Win32에 관심이 있다면 Charles Petzold의 Programming Windows 5th edition을 권합니다.

C++ WinForms를 배우고 싶다면 ... C# 또는 VB.NET으로 전환하는 것이 더 직관적 일 수 있기 때문에 전환하는 것이 좋습니다.

희망이 도움이됩니다. 건배.

2

참조하는 기사는 WinForms 앱이 아닌 네이티브 C++ 응용 프로그램에서 수행하는 방법에 대해 설명합니다. WndProc에서 메시지를 처리하는 대신 OnPaint 메서드를 재정의해야합니다.

1

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); 
} 
+0

나는 C++이 아니라 C++ 코드 Andrew를 언급한다고 생각한다. 가난한 청년을 혼란스럽게하는 차이점이 충분합니다. – user72491

+0

예, 고맙게도 저는 C#에서 많은 경험을 가졌습니다. 그래서 그것을 볼 때 알았고 꽤 빨리 C++로 변환했습니다. Win32 응용 프로그램과 Windows Forms 응용 프로그램 인 Andrew Grant의 차이점을 지적 해 주셔서 감사합니다. –

+0

이상한, 원래의 질문에있는 코드는 C++처럼 보입니다. –

관련 문제