窗口WM_PAINT 消息,始终不触发. 为什么?创建窗口后, WM_PAINT消息始终不触发, 创建窗口后,UpdateWindow(hW
窗口WM_PAINT 消息,始终不触发. 为什么?
创建窗口后, WM_PAINT消息始终不触发, 创建窗口后,UpdateWindow(hWnd)也未触发WM_PAINT消息. 请问这是为什么?
整体源码如下:
- C/C++ code
#include <windows.h>void Show (HWND hwnd, HDC hdc, int xText, int yText, int iMapMode, TCHAR *szMapMode){ TCHAR szBuffer[60]; RECT rect; SaveDC(hdc); SetMapMode(hdc, iMapMode); GetClientRect(hwnd, &rect); DPtoLP(hdc, (PPOINT)&rect, 2); RestoreDC(hdc, -1); TextOut(hdc, xText, yText, szBuffer, wsprintf(szBuffer, TEXT("%-20s %7d %7d %7d %7d"), szMapMode, rect.left, rect.right, rect.top, rect.bottom));}LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){ static TCHAR szHeading[] = TEXT("Mapping Mode Left Right Top Bottom"); static TCHAR szUndLine[] = TEXT("------------ ---- ----- --- ------"); static int cxChar, cyChar; HDC hdc; PAINTSTRUCT ps; TEXTMETRIC tm; TCHAR szBuf[64]; switch (message) { case WM_CREATE: hdc = GetDC(hwnd); if (hdc == NULL) MessageBox(NULL, TEXT("GetDc Fail!"), TEXT("Err"), MB_OK); SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT)); GetTextMetrics(hdc, &tm); cxChar = tm.tmAveCharWidth; cyChar = tm.tmHeight + tm.tmExternalLeading; ReleaseDC(hwnd, hdc); return 0; case WM_PRINT: hdc = BeginPaint(hwnd, &ps); SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT)); SetMapMode(hdc, MM_ANISOTROPIC); SetWindowExtEx(hdc, 1, 1, NULL); SetViewportExtEx(hdc, cxChar, cyChar, NULL); TextOut(hdc, 1, 1, szHeading, lstrlen(szHeading)); TextOut(hdc, 1, 2, szUndLine, lstrlen(szUndLine)); Show(hwnd, hdc, 1, 3, MM_TEXT, TEXT("TEXT(pixels)")); Show(hwnd, hdc, 1, 4, MM_LOMETRIC, TEXT("LOMETRIC(.lmn)")); Show(hwnd, hdc, 1, 5, MM_HIMETRIC, TEXT("HIMETRIC(.01mm)")); Show(hwnd, hdc, 1, 6, MM_LOENGLISH, TEXT("LOENGLISH(.01 in)")); Show(hwnd, hdc, 1, 7, MM_HIENGLISH, TEXT("HIENGLISH(.001 in)")); Show(hwnd, hdc, 1, 8, MM_TWIPS, TEXT("TWIPS(1/1400 in)")); EndPaint(hwnd, &ps); return 0; case WM_SIZE: wsprintf(szBuf, TEXT("x:%d y:%d"), LOWORD(lParam), HIWORD(lParam)); //MessageBox(NULL, szBuf, TEXT("Size"), MB_OK); break; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hwnd, message, wParam, lParam);}int WINAPI WinMain(__in HINSTANCE hInstance, __in_opt HINSTANCE hPrevInstance, __in_opt LPSTR lpCmdLine, __in int nShowCmd ){ static TCHAR szWinTitle[] = TEXT("WinMain"); HWND hWnd; MSG msg; WNDCLASS wndClass; wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpszClassName = szWinTitle; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; wndClass.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_ICON2)); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //wndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1); wndClass.lpszMenuName = NULL; if (!RegisterClass(&wndClass)) { MessageBox(NULL, TEXT("RegisterClass Fail!!"), TEXT("Err"), MB_OK); return 0; } hWnd = CreateWindow(szWinTitle, TEXT("WinMain"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hWnd, nShowCmd); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam;}
[解决办法]
- C/C++ code
//case WM_PRINT:// as you code , please case WM_PAINT not WM_PRINT写差了,不是WM_PRINT而是WM_PAINT
[解决办法]
主要问题如二楼所说拼写错误,此外补充一下,UpdateWindow并不是一定发送WM_PAINT的,存在无效区域才会发送WM_PAINT消息。
