2014-02-28 2 views
0

어떻게 커스텀 보더를 그리는 지, 실제로 저는 1 픽셀 경계를 그리려하고 있지만 실패했습니다, 어떻게 이것을 할 수 있습니까? 나는 this.but 시도했다 failed.i 잘 했어 때 창문을 가지고 있지 않습니다 .. 창문 내 창문에 내 경우에는 3 자녀 창이이 깜박 점점이 사건.win32에서 사용자 정의 테두리를 그리는 방법은 무엇입니까?

  case WM_NCACTIVATE : 
      { 
       if(TRUE == wParam) 
      { 
     stateofWindow = true; 
     InvalidateRect(hwnd,NULL,true); 
      } 
     else if(FALSE == wParam) 
     { 
     stateofWindow = false; 
     InvalidateRect(hwnd,NULL,true); 
     } 
    } 
break; 

case WM_NCCALCSIZE : 
    { 
     if (true == wParam) 
     {  
      return 0; 
     } 
    } 
    break; 
case WM_PAINT: 
    { 
     HDC hcd = NULL; 
     PAINTSTRUCT ps; 
     hcd = BeginPaint(hwnd,&ps); 

     HPEN hPen = CreatePen(PS_SOLID, 1, RGB(165,165,165));; 

     SelectObject(hcd, hPen); 

     RECT rcClientRect = {0}; 

     GetClientRect(hwnd,&rcClientRect); 
     //GetWindowRect(hwnd,&rcClientRect); 

     if(FALSE == stateofWindow) 
     { 
      MoveToEx(hcd,rcClientRect.left,rcClientRect.top,NULL); 

      LineTo(hcd,rcClientRect.right-1,rcClientRect.top); 

      LineTo(hcd,rcClientRect.right-1,rcClientRect.bottom-1); 

      LineTo(hcd,rcClientRect.left,rcClientRect.bottom-1); 

      LineTo(hcd,rcClientRect.left,rcClientRect.top); 
     } 
     else 
     { 
      HPEN hPen1 = CreatePen(PS_SOLID, 1, RGB(255,0,0));; 

      SelectObject(hcd, hPen1); 

      MoveToEx(hcd,rcClientRect.left,rcClientRect.top,NULL); 

      LineTo(hcd,rcClientRect.right-1,rcClientRect.top); 

      LineTo(hcd,rcClientRect.right-1,rcClientRect.bottom-1); 

      LineTo(hcd,rcClientRect.left,rcClientRect.bottom-1); 

      LineTo(hcd,rcClientRect.left,rcClientRect.top); 
     } 
     EndPaint(hwnd,&ps); 
    } 
      break; 
+0

일반적으로 클라이언트가 아닌 그림을 그리는 것은 나쁜 생각입니다. (당신이 할 수있는 일은 * 할 수 있다는 것을 의미하지는 않습니다.) –

+0

u 님의 답변에 감사드립니다. 나는 그것을 시도했지만 그것은 효과가 없었다. – sindhu

답변

2

다소 복잡합니다. WM_NCCALCSIZE, WM_NCPAINTWM_NCHITTEST 이상을 올바르게 처리해야합니다.

Aero가 온 이후로 시도한 적이 없으며 Aero가 많은 것을 변경했음을 알고 있습니다. 실제 테두리의 크기를 조정하는 대신 Aero에서 경계없는 창을 사용하고 Dwm* 테두리 모양과 동작을 추가하는 기능 (MSDN에는 an article이있었습니다).

+0

감사합니다.이 문제를 해결할 수있는 아이디어가 있습니까? 나는 시도했지만 정확한 결과를 얻지 못했다. – sindhu

+0

IIRC, WM_NCCALCSIZE에는 일종의 잡아 당김이 있었지만 첫 번째 시도에서 바로 사용할 수 없었습니다. 불행히도 나는 세부 사항을 편리하게 가지고 있지 않다. 첫 번째 테스트의 경우 WM_PAINT에서 사각형을 채우면 WM_NCPAINT를 무시할 수 있습니다.이 목표는 클라이언트 영역의 크기가 항상 올바른지 확인하는 것입니다. – Medinoc

관련 문제