2010-12-23 78 views
0

我最近有我的主窗口使用WM_PAINT寫文本,但現在我意識到這可能不是最好的消息,所以我嘗試了另一個版本;win32:TextOut not displayed

主窗口包含一個菜單,在菜單項中ID_FILE_PID消息被髮送並且它構建4個新窗口以及在主窗口(paintEditSigns函數)中顯示文本。 4個窗口工作正常,但文本dosn't工作根本,除非我在main()函數中執行,如圖所示...究竟是什麼? O_O

順便說一句:我仍然不知道爲什麼當我發佈時,StackOverflow上的代碼顯示看起來很奇怪,爲什麼?

switch(message) 
    { 
    case WM_COMMAND: 
    switch (LOWORD(wParam)) 
     { 
      case ID_FILE_PID: 
      { 
       HWND hWndButton;  
       HWND hWndEdit; 
       HWND hWndEdit2; 
       HWND hWndDisplay; 

       // drawing the text in mainwindow 
       trigger=true; 

       // adding new windows in the mainwindow 
       hWndButton = CreateWindowEx(0,TEXT("BUTTON"),"Modify",WS_CHILD | WS_VISIBLE | 
       BS_DEFPUSHBUTTON, 170,56,80,30,hWnd,(HMENU)ID_BUTTON,hThisInstance,NULL); 
       hWndEdit = CreateWindowEx(0,RICHEDIT_CLASS,TEXT(""),WS_CHILD | WS_VISIBLE | WS_BORDER, 
       120,30,80,25,hWnd,(HMENU)ID_EDIT,hThisInstance,NULL); 
       hWndEdit2 = CreateWindowEx(0,RICHEDIT_CLASS,TEXT(""),WS_CHILD | WS_VISIBLE | WS_BORDER, 
       220,30,80,25,hWnd,(HMENU)ID_EDIT2,hThisInstance,NULL); 
       hWndDisplay = CreateWindowEx(0,TEXT("STATIC"),NULL,WS_CHILD | WS_VISIBLE | WS_BORDER, 
       0,100,450,140,hWnd,(HMENU)ID_DISPLAY,hThisInstance,NULL); 


          UpdateWindow(hWnd); 

       break; 
      } 

..... 

case WM_PAINT: 
    { 
     if (trigger) { 
      paintEditSigns() 
     } 
     break; 

    } 

// 
// Main function 
// 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, 
       LPSTR lpCmdLine, int nCmdShow) 
{ 
    HWND hWnd; 
    WNDCLASSEX wc; 
    ZeroMemory(&wc, sizeof(WNDCLASSEX)); 
    hThisInstance = hInstance; 
    LoadLibrary("Riched20.dll"); 

    wc.cbSize = sizeof(WNDCLASSEX); 
    wc.style = CS_HREDRAW | CS_VREDRAW; 
    wc.lpfnWndProc = WindowProc; 
    wc.hInstance = hInstance; 
    wc.lpszMenuName = MAKEINTRESOURCE(IDR_MYMENU); 
    if(!(wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_MYICON)))) { 
     HRESULT res = GetLastError(); 

    } 
    wc.hCursor = LoadCursor(NULL, IDC_ARROW); 
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW; 
    wc.lpszClassName = TEXT("testcpp"); 
    RegisterClassEx(&wc); 

    hWnd = CreateWindowEx(NULL, 
          wc.lpszClassName, 
          TEXT("test"), 
          WS_OVERLAPPEDWINDOW, 
          300, 
          200, 
          450, 
          300, 
          NULL, 
          NULL, 
          hInstance, 
          NULL); 
    ShowWindow(hWnd,nCmdShow); 
     //paintEditSigns() -- here it works, but not when in the message part 

    MSG msg; 
    while (GetMessage(&msg, NULL,0,0)) { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 

    } 


    return msg.wParam; 
} 



void paintEditSigns() { 
    HFONT hf = createFont(); 
    PAINTSTRUCT ps; 
    HWND hWnd = FindWindow(TEXT("testcpp"),TEXT("test")); 
    HBRUSH hbruzh = CreateSolidBrush(RGB(0,0,0)); 
    HDC hdz = BeginPaint(hWnd,&ps); 
    string s = "Memory Address"; 

    SelectBrush(hdz,hbruzh); 
    SelectFont(hdz,hf); 
    TextOut(hdz,0,100,s.c_str(),s.length()); 
    EndPaint(hWnd,&ps); 

    DeleteObject(hbruzh); 

} 

HFONT createFont() { 
    HDC hdc; 
    long lfHeight; 

    hdc = GetDC(NULL); 
    lfHeight = -MulDiv(12, GetDeviceCaps(hdc, LOGPIXELSY), 72); 
    ReleaseDC(NULL, hdc); 

    HFONT hf = CreateFont(lfHeight, 0, 0, 0, 0, TRUE, 0, 0, 0, 0, 0, 0, 0, "MS Sans Serif"); 
    return hf; 

} 
+0

要修改格式,您應該選擇您的代碼,然後單擊編輯器工具欄中的「{}」按鈕,這會將所有代碼縮進4個空格,然後將其作爲代碼格式化。 – 2010-12-23 14:53:50

+0

關於你的代碼的幾條評論:1)你不應該在設備上下文中選擇一個GDI對象`DeleteObject`。通常的做法是保存舊的對象句柄,然後在「DeleteObject」之前重新選擇它。 2)`LoadLibrary`返回一個ref-counting句柄。適當時您應該釋放該句柄。 3)你不需要使用`UpdateWindow`。 GDI和winapi繪畫需要很多習慣,所以我認爲每個人在某個時候都會遇到這樣的問題。請仔細閱讀API的MSDN文檔,不要忽略混淆的部分;試着去了解他們。 – tenfour 2010-12-23 15:00:24

回答

1

您可以使用BeginPaint/EndPaint響應WM_PAINT。並WM_PAINT是這樣做的繪圖適當的地方。

當窗口的一部分「失效」時,Windows調用WM_PAINT。例如,如果您恢復窗口,或者窗口的一部分在將窗口移開或調整窗口大小之後變爲可見。

當您需要手動更新顯示時,通過調用InvalidateRect(這告訴Windows需要重繪的窗口區域),使需要重繪的區域「無效」。

通常是使整個窗口無效,而不是計算要繪製的區域的實際像素完美邊界。