2012-11-26 2 views
1

어떤 이벤트 (WM_PAINT 메시지가 아님)에 대한 응답으로 창에서 클라이언트 영역에 텍스트를 그립니다 (그리기) 중입니다. WM_PAINT에 대한 호출 사이의 클라이언트 영역? 나는 WM_PAINT 메시지가있을 때마다 (또는 창이 새로 고침) 윈도우가 다시 그려지고 측면의 모든 것이 더 이상 중요하지 않다는 것을 이해합니다. 나는 코드와 더 잘 의사 소통 할 수있을 것이라고 생각한다. 그래서 지금 내가 가진 것은 여기있다. 당신이 볼 수 있듯이win32에서 WM_PAINT 호출 사이에 그려진 클라이언트 영역을 유지합니다.

HDC mdc; 

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance, 
        LPSTR lpszArgument, int nFunsterStil) 
{ 
    LoadBitmap(...); // for skinning the app. 
    stuff.. 
} 

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    case WM_PAINT: 
     PAINTSTRUCT ps; 

      HDC hdc = BeginPaint(hwnd, &ps); 
      BITMAP bm; 

      HDC dcSkin = CreateCompatibleDC(hdc); 
      GetObject(hSkinBmp, sizeof(bm), &bm); 
      SelectObject(dcSkin, hSkinBmp); 

      BitBlt(dcSkin, 0, 0, wWidth, wHeight, mdc, 0, 0, SRCCOPY); 
      BitBlt(hdc, 0, 0, wWidth, wHeight, dcSkin, 0, 0, SRCCOPY); 

      DeleteDC(dcSkin); 

      EndPaint(hwnd, &ps); 
    break; 


    case WM_LBUTTONDOWN; 

      HDC hdc = GetDC(hwnd); 

      mdc = CreateCompatibleDC(hdc); 


      LPRECT rect; 
      GetClientRect(hwnd, rect); 

      SelectObject(mdc, CreateCompatibleBitmap(hdc, rect->right, rect->bottom)); 

      BitBlt(mdc,0,0,rect->right,rect->bottom,hdc,0,0,SRCCOPY); 


      HFONT hfont = CreateFont(0, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, 
          DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, 
          PROOF_QUALITY, DEFAULT_PITCH | FF_SWISS , 0); 

      HFONT hOldFont = (HFONT)SelectObject(mdc, hfont); 

      SetTextColor(mdc, RGB(255,0,0)); 
      SetBkColor(mdc, RGB(255,255,0)); 
      TextOut(mdc, 50, 150, logintext.c_str(), strlen(logintext.c_str())); 

      SelectObject(mdc, hOldFont); 
      ReleaseDC(hwnd, hdc); 
      InvalidateRect(hwnd, 0, TRUE); 

    break; 
} 

, 내가 출력에 피부 클라이언트 영역의 상단에 텍스트를 마우스 버튼을 아래로 메시지가 오면 그 다음, BMP와 윈도우의 클라이언트 영역을 페인트합니다. 내가이 WM_LBUTTONDOWN 메시지에서 만든 메모리 DC를 저장하고 피부에 직류 텍스트의 직류 (WM_LBUTTONDOWN에서 만든 메모리 DC) 먼저 윈도우 직류 페인트 위해 노력하고있는 중이 야.

은 피부 비트 맵 쇼는 그것에 생각하지만, 텍스트하지 않습니다 때문입니다.

내가 이것을 어떻게 달성합니까?

+0

'WM_PAINT' 핸들러에게 "이봐, 칠할 때 로그인 텍스트를 그릴 수 있겠 니? 고마워."라고 말하면됩니다. –

답변

2

난 당신이 WM_PAINT 이외의 일을 그리려하고 지속이 제대로 이해합니다. 불행히도 그것은 창문이 작동하는 방식이 아닙니다.

당신은 윈도우의 내용이 어느 순간 다시 그려 파괴 할 수 있습니다로 WM_PAINT 처리기에서 모든을 다시 그릴 수 있어야합니다, 그래서 당신은 당신의 프로그램이 작업을 수행 할 수 있도록를 구성해야합니다. 대신 WM_PAINT 핸들러 외부에 무엇이든 그리는 대신 화면에 무엇이 있어야하는지 프로그램에 알려주는 플래그 나 다른 상태를 설정 한 다음 화면 영역을 무효화하여 WM_PAINT가 해당 영역을 그리기 위해 실행됩니다.

당신이 쉽게 할 수있는 한 가지 대안은 업데이트가 필요할 때마다 오프 스크린 비트 맵에 모든 것을 그려서 항상 WM_PAINT 함수가 비트 맵을 화면에 그려서 항상 최신 상태로 유지하도록하는 것입니다.

+0

WM_PAINT에서 모든 것을 다시 그려야한다는 것을 이해합니다. 그래서 "mdc"를 저장했는데, 틀렸다고 생각합니다. 메모리 비트 맵을 저장해야합니까? 코드를 편집했습니다. 한번보세요. 플래그 설정에 대해 생각했지만 불행히도 텍스트를 그리는 데 고려해야 할 변수가 너무 많아서 그 아이디어를 삭제했습니다. 코드 수정을 도와주세요. – StudentX

+0

당신의 포스트를 다시 읽으십시오. 나는 당신이 그 모든 것을 알고 있었고 회신이 upvotes의 가치가 없다고 생각합니다. 나는 누군가에게 유용 할 수 있기 때문에 그것을 지우고 싶지는 않지만 어떻게 그것을 인정하지 않을 수 있습니까? 코드에 대해서는 내가 나중에 제안한 것을 수행하려고 시도하는 것처럼 보이지 않는 부분을 나중에 보게 될 것입니다. 나는 다른 누군가가 들어갈 수 있기를 바랍니다 :) – jcoder

관련 문제