2012-06-22 19 views
2

我想提請在靜態控制線:如何在靜態控件中繪製線條?

case WM_CREATE: 
    { 
     hgraph=CreateWindow(WC_STATIC,NULL,WS_CHILD|WS_VISIBLE|SS_CENTER,20,20,660,80,hWnd,NULL,NULL,NULL); 
     SendMessage(hgraph,WM_SETTEXT,NULL,(LPARAM) "My Static"); 
     break; 
    } 
    case WM_PAINT: 
    { 

     hdc=GetDC(hgraph); 
     hp=CreatePen(0 ,5,RGB(0,100,0)); 
     SelectObject(hdc,hp); 
     MoveToEx(hdc, 0, 0, 0); 
     LineTo(hdc, 100, 100); 
     ReleaseDC(hgraph, hdc); 
    } 

    break; 

而且走得靜態控制之下: enter image description here

+2

當然,你畫你的主窗口,而不是控制。你需要繼承它。 –

回答

2

當繪製到任何子窗口,你需要在WM_PAINT內做繪圖的子窗口過程,而不在您父母窗口的WM_PAINT中。

對於系統控制(例如靜態),您需要子類窗口,這意味着您需要用您自己的系統定義的窗口過程替換。一旦您將自己的窗口過程安裝到系統控制中,您就可以捕獲系統控制中的WM_PAINT事件來完成繪畫。

完整的程序如下:

  1. 定義你的替換窗口過程的靜態控制。

    我們還必須定義一個變量,我們可以使用該變量來存儲控制的原始系統窗口過程,我們必須在某個時刻調用該過程以允許控件按正常方式繪製。

    static WNDPROC pFnPrevFunc; 
    
    static LRESULT CALLBACK ProcessStaticMessages(HWND hWindow, 
                   UINT uMessage, 
                   WPARAM wParam, 
                   LPARAM lParam) 
    { 
        /* 
        * call the original system handler so the control 
        * gets painted as normal. 
        */ 
        (*pFnPrevFunc)(hWindow, uMessage, wParam, lParam); 
    
        /* 
        * perform our custom operations on this control in 
        * addition to system operations. 
        */ 
        switch (uMessage) 
        { 
         ... 
    
         case WM_PAINT: 
          /* 
          * static control has just been painted by system. 
          */ 
          hDC = GetDC(hWindow); 
    
          /* draw your lines on the static control */ 
    
          ReleaseDC(hWindow, hDC); 
          return TRUE; 
        } 
    
        return TRUE; 
    } 
    
  2. 創建你的靜態控制窗口。

    hWndStatic = CreateWindow(WC_STATIC, (LPSTR) NULL, WS_CHILD|...); 
    
  3. 子類的靜態控制窗口(安裝你的窗口過程)

    pFnPrevFunc = SetWindowLongPtr(hWndStatic, 
               GWLP_WNDPROC, 
               (LONG_PTR) ProcessStaticMessages); 
    

如果工作正常,那麼你就應該收到WM_PAINT消息您的私人信息處理功能的靜態,並且您的繪圖應該正確地發生。

1

黑!不要忘記在靜態過程中添加DefWindowProc。有時,如果沒有DefWindowProc函數,則無法繪製控件。

例子:

LRESULT CALLBACK StaticProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch(Msg) 
    { 
     case WM_PAINT: 
      // Do paint here. 
      break; 
    } 
    return DefWindowProc(hWnd, Msg, wParam, lParam); // Call Default Window Procedure. 
}