The Basic Windows Message (The Old New Story)
A. First Edition
This is just a little practice and I am bit embarrassed when I made some low level mistakes. However, I don't think the
comment is fair enough!
B.The problem
The problem starts like this. In the simplest "hello-world" windows creation program, I forget to return the "DefWindowProc". And it takes me hours to debug and still have no clue why "CreateWindow" fails. W gives me some intolerable comments when he pointed out my mistake. But he doesn't really understand the real reason behind this.
Usually when you setup a callback function, you don't really need to guarantee it works because it is just a pointer and
only fails when the program runs. However, "CreateWindow" does more than what I expect. It deliberately asks you to handle
at least some basic message. i.e. If you don't return TRUE for message "WM_NCCREATE", "CreateWindow" will fail. And this
is the reason when you don't use "DefWindowProc" and fail to create window because in many other message handling you need
to return 0 instead of 1.
First I trace to write down all possible message in a file and then try to figure out what is the minimum message needed
to be processed by "DefWindowProc". This is really a boring job and that is why this simple program is worthwhile to be
posted because you have to copy&paste for nearly one hundred message cases.
D.The major functions
E.Further improvement
I finally pinpoint all fundamental messages and it is quite worthwhile for a whole evening work!
F.File listing
1. myWin.cpp
file name: myWin.cpp
#include <windows.h> #include <stdio.h> WNDCLASS wndClass; int nWinWidth, nWinHeight; BYTE count=200; int counter=0; FILE* stream; LRESULT CALLBACK WindowProc (HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { //fprintf(stream, "%d:", counter++); switch(uMsg) { //this is necessary because CreateWindow may fail if not return TRUE case WM_NCCREATE: fprintf(stream, "WM_NCCREATE"); return TRUE;////////////////// break; //this is necessary because window won't calculate redraw area case WM_NCCALCSIZE: fprintf(stream, "WM_NCCALCSIZE"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; //this is when window draw title bar case WM_NCACTIVATE: fprintf(stream, "WM_NCACTIVATE"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; //window paint frame case WM_NCPAINT: fprintf(stream, "WM_NCPAINT"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; //paint background case WM_ERASEBKGND: fprintf(stream, "WM_ERASEBKGND"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; //all mouse click event needs this case WM_NCHITTEST: fprintf(stream, "WM_NCHITTEST"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; //you want to set mouse cursor to arrow instead of "sand" case WM_SETCURSOR: fprintf(stream, "WM_SETCURSOR"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; //you want mouse be clicked and up case WM_NCLBUTTONDOWN: fprintf(stream, "WM_NCLBUTTONDOWN"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; //you want system command be carried, like shutdown from "window menu" case WM_SYSCOMMAND : fprintf(stream, "WM_SYSCOMMAND "); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; //ask you if you want to shut down case WM_CLOSE: fprintf(stream, "WM_CLOSE"); DestroyWindow(hwnd); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; //if you don't post quit message, message loop won't end case WM_DESTROY: fprintf(stream, "WM_DESTROY"); PostQuitMessage(0); break; } return 0L; } /* LRESULT CALLBACK WindowProc (HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { //fprintf(stream, "%d:", counter++); switch(uMsg) { case WM_GETMINMAXINFO: fprintf(stream, "WM_GETMINMAXINFO"); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_NCCREATE: fprintf(stream, "WM_NCCREATE"); return TRUE;////////////////// break; case WM_NCCALCSIZE: fprintf(stream, "WM_NCCALCSIZE"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_CREATE: fprintf(stream, "WM_CREATE"); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_SHOWWINDOW: fprintf(stream, "WM_SHOWWINDOW"); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_WINDOWPOSCHANGING: fprintf(stream, "WM_WINDOWPOSCHANGING"); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_ACTIVATEAPP: fprintf(stream, "WM_ACTIVATEAPP"); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_NCACTIVATE: fprintf(stream, "WM_NCACTIVATE"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_GETTEXT: fprintf(stream, "WM_GETTEXT"); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_ACTIVATE: fprintf(stream, "WM_ACTIVATE"); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_IME_SETCONTEXT: fprintf(stream, "WM_IME_SETCONTEXT"); break; case WM_IME_NOTIFY: fprintf(stream, "WM_IME_NOTIFY"); break; case WM_SETFOCUS: fprintf(stream, "WM_SETFOCUS"); break; case WM_NCPAINT: fprintf(stream, "WM_NCPAINT"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_ERASEBKGND: fprintf(stream, "WM_ERASEBKGND"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_WINDOWPOSCHANGED: fprintf(stream, "WM_WINDOWPOSCHANGED"); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_SIZE: fprintf(stream, "WM_SIZE"); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_MOVE: fprintf(stream, "WM_MOVE"); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_PAINT: fprintf(stream, "WM_PAINT"); break; case WM_GETICON: fprintf(stream, "WM_GETICON"); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_KEYUP: fprintf(stream, "WM_KEYUP"); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_NCHITTEST: fprintf(stream, "WM_NCHITTEST"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_SETCURSOR: fprintf(stream, "WM_SETCURSOR"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case EN_KILLFOCUS: fprintf(stream, "EN_KILLFOCUS"); break; case WM_NCMOUSEMOVE: fprintf(stream, "WM_NCMOUSEMOVE"); break; case WM_NCLBUTTONDOWN: fprintf(stream, "WM_NCLBUTTONDOWN"); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_CAPTURECHANGED: fprintf(stream, "WM_CAPTURECHANGED"); break; case WM_SYSCOMMAND : fprintf(stream, "WM_SYSCOMMAND "); return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_CLOSE: fprintf(stream, "WM_CLOSE"); DestroyWindow(hwnd); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; case WM_KILLFOCUS: fprintf(stream, "WM_KILLFOCUS"); break; case WM_DESTROY: fprintf(stream, "WM_DESTROY"); PostQuitMessage(0); break; default: fprintf(stream, "not listed %d", uMsg); //return DefWindowProc(hwnd, uMsg, wParam, lParam); break; } fprintf(stream, "\n"); return 0L; } */ /* LRESULT CALLBACK WindowProc (HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { //fprintf(stream, "%d:", counter++); switch(uMsg) { case WM_ACTIVATE: fprintf(stream, "WM_ACTIVATE"); break; case WM_ACTIVATEAPP: fprintf(stream, "WM_ACTIVATEAPP"); break; case WM_CANCELMODE: fprintf(stream, "WM_CANCELMODE"); break; case WM_CHILDACTIVATE: fprintf(stream, "WM_CHILDACTIVATE"); break; case WM_CLOSE: fprintf(stream, "WM_CLOSE"); break; case WM_COMPACTING: fprintf(stream, "WM_COMPACTING"); break; case WM_CREATE: fprintf(stream, "WM_CREATE"); break; case WM_DESTROY: fprintf(stream, "WM_DESTROY"); PostQuitMessage(0); break; case WM_ENABLE: fprintf(stream, "WM_ENABLE"); break; case WM_ENTERSIZEMOVE: fprintf(stream, "WM_ENTERSIZEMOVE"); break; case WM_EXITSIZEMOVE: fprintf(stream, "WM_EXITSIZEMOVE"); break; case WM_GETICON: fprintf(stream, "WM_GETICON"); break; case WM_GETMINMAXINFO: fprintf(stream, "WM_GETMINMAXINFO"); break; case WM_GETTEXT: fprintf(stream, "WM_GETTEXT"); break; case WM_GETTEXTLENGTH: fprintf(stream, "WM_GETTEXTLENGTH"); break; case WM_INPUTLANGCHANGE: fprintf(stream, "WM_INPUTLANGCHANGE"); break; case WM_INPUTLANGCHANGEREQUEST: fprintf(stream, "WM_INPUTLANGCHANGEREQUEST"); break; case WM_MOVE: fprintf(stream, "WM_MOVE"); break; case WM_MOVING: fprintf(stream, "WM_MOVING"); break; case WM_NCACTIVATE: fprintf(stream, "WM_NCACTIVATE"); break; case WM_NCCALCSIZE: fprintf(stream, "WM_NCCALCSIZE"); break; case WM_NCCREATE: fprintf(stream, "WM_NCCREATE"); //return TRUE;/// break; case WM_NCDESTROY: fprintf(stream, "WM_NCDESTROY"); break; case WM_PARENTNOTIFY: fprintf(stream, "WM_PARENTNOTIFY"); break; case WM_QUERYDRAGICON: fprintf(stream, "WM_QUERYDRAGICON"); break; case WM_QUERYOPEN: fprintf(stream, "WM_QUERYOPEN"); break; case WM_QUIT: fprintf(stream, "WM_QUIT"); break; case WM_SETICON: fprintf(stream, "WM_SETICON"); break; case WM_SETTEXT: fprintf(stream, "WM_SETTEXT"); break; case WM_SHOWWINDOW: fprintf(stream, "WM_SHOWWINDOW"); break; case WM_SIZE: fprintf(stream, "WM_SIZE"); break; case WM_SIZING: fprintf(stream, "WM_SIZING"); break; case WM_STYLECHANGED: fprintf(stream, "WM_STYLECHANGED"); break; case WM_STYLECHANGING: fprintf(stream, "WM_STYLECHANGING"); break; case WM_USERCHANGED: fprintf(stream, "WM_USERCHANGED"); break; case WM_WINDOWPOSCHANGED: fprintf(stream, "WM_WINDOWPOSCHANGED"); break; case WM_WINDOWPOSCHANGING: fprintf(stream, "WM_WINDOWPOSCHANGING"); break; case WM_IME_CHAR: fprintf(stream, "WM_IME_CHAR"); break; case WM_IME_COMPOSITION: fprintf(stream, "WM_IME_COMPOSITION"); break; case WM_IME_COMPOSITIONFULL: fprintf(stream, "WM_IME_COMPOSITIONFULL"); break; case WM_IME_CONTROL: fprintf(stream, "WM_IME_CONTROL"); break; case WM_IME_ENDCOMPOSITION: fprintf(stream, "WM_IME_ENDCOMPOSITION"); break; case WM_IME_KEYDOWN: fprintf(stream, "WM_IME_KEYDOWN"); break; case WM_IME_KEYUP: fprintf(stream, "WM_IME_KEYUP"); break; case WM_IME_NOTIFY: fprintf(stream, "WM_IME_NOTIFY"); break; //win2k msg // case WM_IME_REQUEST: // fprintf(stream, "WM_IME_REQUEST"); // break; case WM_IME_SELECT: fprintf(stream, "WM_IME_SELECT"); break; case WM_IME_SETCONTEXT: fprintf(stream, "WM_IME_SETCONTEXT"); break; case WM_IME_STARTCOMPOSITION: fprintf(stream, "WM_IME_STARTCOMPOSITION"); break; case WM_POWERBROADCAST: fprintf(stream, "WM_POWERBROADCAST"); break; case WM_DEVICECHANGE: fprintf(stream, "WM_DEVICECHANGE"); break; case WM_MDIACTIVATE: fprintf(stream, "WM_MDIACTIVATE"); break; case WM_MDICASCADE: fprintf(stream, "WM_MDICASCADE"); break; case WM_MDICREATE: fprintf(stream, "WM_MDICREATE"); break; case WM_MDIDESTROY: fprintf(stream, "WM_MDIDESTROY"); break; case WM_MDIGETACTIVE: fprintf(stream, "WM_MDIGETACTIVE"); break; case WM_MDIICONARRANGE: fprintf(stream, "WM_MDIICONARRANGE"); break; case WM_MDIMAXIMIZE: fprintf(stream, "WM_MDIMAXIMIZE"); break; case WM_MDINEXT: fprintf(stream, "WM_MDINEXT"); break; case WM_MDIREFRESHMENU: fprintf(stream, "WM_MDIREFRESHMENU"); break; case WM_MDIRESTORE: fprintf(stream, "WM_MDIRESTORE"); break; case WM_MDISETMENU: fprintf(stream, "WM_MDISETMENU"); break; case WM_MDITILE: fprintf(stream, "WM_MDITILE"); break; case EM_CANUNDO: fprintf(stream, "EM_CANUNDO"); break; case EM_CHARFROMPOS: fprintf(stream, "EM_CHARFROMPOS"); break; case EM_EMPTYUNDOBUFFER: fprintf(stream, "EM_EMPTYUNDOBUFFER"); break; case EM_FMTLINES: fprintf(stream, "EM_FMTLINES"); break; case EM_GETFIRSTVISIBLELINE: fprintf(stream, "EM_GETFIRSTVISIBLELINE"); break; case EM_GETHANDLE: fprintf(stream, "EM_GETHANDLE"); break; //case EM_GETIMESTATUS: // fprintf(stream, "EM_GETIMESTATUS"); // break; case EM_GETLIMITTEXT: fprintf(stream, "EM_GETLIMITTEXT"); break; case EM_GETLINE: fprintf(stream, "EM_GETLINE"); break; case EM_GETLINECOUNT: fprintf(stream, "EM_GETLINECOUNT"); break; case EM_GETMARGINS: fprintf(stream, "EM_GETMARGINS"); break; case EM_GETMODIFY: fprintf(stream, "EM_GETMODIFY"); break; case EM_GETPASSWORDCHAR: fprintf(stream, "EM_GETPASSWORDCHAR"); break; case EM_GETRECT: fprintf(stream, "EM_GETRECT"); break; case EM_GETSEL: fprintf(stream, "EM_GETSEL"); break; case EM_GETTHUMB: fprintf(stream, "EM_GETTHUMB"); break; case EM_GETWORDBREAKPROC: fprintf(stream, "EM_GETWORDBREAKPROC"); break; case EM_LIMITTEXT: fprintf(stream, "EM_LIMITTEXT"); break; case EM_LINEFROMCHAR: fprintf(stream, "EM_LINEFROMCHAR"); break; case EM_LINEINDEX: fprintf(stream, "EM_LINEINDEX"); break; case EM_LINELENGTH: fprintf(stream, "EM_LINELENGTH"); break; case EM_LINESCROLL: fprintf(stream, "EM_LINESCROLL"); break; case EM_POSFROMCHAR: fprintf(stream, "EM_POSFROMCHAR"); break; case EM_REPLACESEL: fprintf(stream, "EM_REPLACESEL"); break; case EM_SCROLL: fprintf(stream, "EM_SCROLL"); break; case EM_SCROLLCARET: fprintf(stream, "EM_SCROLLCARET"); break; case EM_SETHANDLE: fprintf(stream, "EM_SETHANDLE"); break; //case EM_SETIMESTATUS: // fprintf(stream, "EM_SETIMESTATUS"); // break; case EM_SETMARGINS: fprintf(stream, "EM_SETMARGINS"); break; case EM_SETMODIFY: fprintf(stream, "EM_SETMODIFY"); break; case EM_SETPASSWORDCHAR: fprintf(stream, "EM_SETPASSWORDCHAR"); break; case EM_SETREADONLY: fprintf(stream, "EM_SETREADONLY"); break; case EM_SETRECT: fprintf(stream, "EM_SETRECT"); break; case EM_SETRECTNP: fprintf(stream, "EM_SETRECTNP"); break; case EM_SETSEL: fprintf(stream, "EM_SETSEL"); break; case EM_SETTABSTOPS: fprintf(stream, "EM_SETTABSTOPS"); break; case EM_SETWORDBREAKPROC: fprintf(stream, "EM_SETWORDBREAKPROC"); case EM_UNDO: fprintf(stream, "EM_UNDO"); break; //case EN_ALIGN_LTR_EC: // fprintf(stream, "EN_ALIGN_LTR_EC"); // break; //case EN_ALIGN_RTL_EC: // fprintf(stream, "EN_ALIGN_RTL_EC"); // break; case EN_CHANGE: fprintf(stream, "EN_CHANGE"); break; case EN_ERRSPACE: fprintf(stream, "EN_ERRSPACE"); break; case EN_HSCROLL: fprintf(stream, "EN_HSCROLL"); break; case EN_KILLFOCUS: fprintf(stream, "EN_KILLFOCUS"); break; case EN_MAXTEXT: fprintf(stream, "EN_MAXTEXT"); break; case EN_SETFOCUS: fprintf(stream, "EN_SETFOCUS"); break; case EN_UPDATE: fprintf(stream, "EN_UPDATE"); break; case EN_VSCROLL: fprintf(stream, "EN_VSCROLL"); break; case WM_COMMAND: fprintf(stream, "WM_COMMAND"); break; case WM_COPY: fprintf(stream, "WM_COPY"); break; case WM_CTLCOLOREDIT: fprintf(stream, "WM_CTLCOLOREDIT"); break; case WM_PASTE: fprintf(stream, "WM_PASTE"); break; case WM_UNDO: fprintf(stream, "WM_UNDO"); break; case WM_DISPLAYCHANGE: fprintf(stream, "WM_DISPLAYCHANGE"); break; case WM_ERASEBKGND: fprintf(stream, "WM_ERASEBKGND"); break; case WM_ICONERASEBKGND: fprintf(stream, "WM_ICONERASEBKGND"); break; case WM_NCPAINT: fprintf(stream, "WM_NCPAINT"); break; case WM_PAINT: fprintf(stream, "WM_PAINT"); break; case WM_PAINTICON: fprintf(stream, "WM_PAINTICON"); break; case WM_PRINT: fprintf(stream, "WM_PRINT"); break; case WM_PRINTCLIENT: fprintf(stream, "WM_PRINTCLIENT"); break; case WM_SETREDRAW: fprintf(stream, "WM_SETREDRAW"); break; //case WM_SYNCPAIN: // fprintf(stream, "WM_SYNCPAIN"); // break; // case WM_APPCOMMAND: // fprintf(stream, "WM_APPCOMMAND"); // break; case WM_CHAR: fprintf(stream, "WM_CHAR"); break; case WM_DEADCHAR: fprintf(stream, "WM_DEADCHAR"); break; case WM_GETHOTKEY: fprintf(stream, "WM_GETHOTKEY"); break; case WM_HOTKEY: fprintf(stream, "WM_HOTKEY"); break; case WM_KEYUP: fprintf(stream, "WM_KEYUP"); break; case WM_KILLFOCUS: fprintf(stream, "WM_KILLFOCUS"); break; case WM_SETFOCUS: fprintf(stream, "WM_SETFOCUS"); break; case WM_SETHOTKEY: fprintf(stream, "WM_SETHOTKEY"); break; case WM_SYSCHAR: fprintf(stream, "WM_SYSCHAR"); break; case WM_SYSDEADCHAR: fprintf(stream, "WM_SYSDEADCHAR"); break; case WM_SYSKEYDOWN: fprintf(stream, "WM_SYSKEYDOWN"); break; // case WM_CHANGEUISTATE: // fprintf(stream, "WM_CHANGEUISTATE"); // break; case WM_INITMENU: fprintf(stream, "WM_INITMENU"); break; case WM_INITMENUPOPUP: fprintf(stream, "WM_INITMENUPOPUP"); break; case WM_MENUCHAR: fprintf(stream, "WM_MENUCHAR"); break; case WM_MENUSELECT: fprintf(stream, "WM_MENUSELECT"); break; // case WM_QUERYUISTATE: // fprintf(stream, "WM_QUERYUISTATE"); // break; case WM_SYSCOMMAND : fprintf(stream, "WM_SYSCOMMAND "); break; // case WM_UPDATEUISTAT: // fprintf(stream, "WM_UPDATEUISTAT"); // break; case WM_CAPTURECHANGED: fprintf(stream, "WM_CAPTURECHANGED"); break; case WM_LBUTTONDBLCLK: fprintf(stream, "WM_LBUTTONDBLCLK"); break; case WM_LBUTTONDOWN: fprintf(stream, "WM_LBUTTONDOWN"); break; case WM_LBUTTONUP: fprintf(stream, "WM_LBUTTONUP"); break; case WM_MBUTTONDBLCLK: fprintf(stream, "WM_MBUTTONDBLCLK"); break; case WM_MBUTTONDOWN: fprintf(stream, "WM_MBUTTONDOWN"); break; case WM_MBUTTONUP: fprintf(stream, "WM_MBUTTONUP"); break; case WM_MOUSEACTIVATE: fprintf(stream, "WM_MOUSEACTIVATE"); break; //case WM_MOUSEHOVER: // fprintf(stream, "WM_MOUSEHOVER"); // break; //case WM_MOUSELEAVE: // fprintf(stream, "WM_MOUSELEAVE"); // break; // case WM_MOUSEWHEEL: // fprintf(stream, "WM_MOUSEWHEEL"); // break; case WM_NCHITTEST: fprintf(stream, "WM_NCHITTEST"); break; case WM_NCLBUTTONDBLCLK: fprintf(stream, "WM_NCLBUTTONDBLCLK"); break; case WM_NCLBUTTONDOWN: fprintf(stream, "WM_NCLBUTTONDOWN"); break; case WM_NCLBUTTONUP: fprintf(stream, "WM_NCLBUTTONUP"); break; case WM_NCMBUTTONDBLCLK: fprintf(stream, "WM_NCMBUTTONDBLCLK"); break; case WM_NCMBUTTONDOWN: fprintf(stream, "WM_NCMBUTTONDOWN"); break; case WM_NCMBUTTONUP: fprintf(stream, "WM_NCMBUTTONUP"); break; //case WM_NCMOUSEHOVER: // fprintf(stream, "WM_NCMOUSEHOVER"); // break; // case WM_NCMOUSELEAVE: // fprintf(stream, "WM_NCMOUSELEAVE"); // break; case WM_NCMOUSEMOVE: fprintf(stream, "WM_NCMOUSEMOVE"); break; case WM_NCRBUTTONDBLCLK: fprintf(stream, "WM_NCRBUTTONDBLCLK"); break; case WM_NCRBUTTONDOWN: fprintf(stream, "WM_NCRBUTTONDOWN"); break; case WM_NCRBUTTONUP: fprintf(stream, "WM_NCRBUTTONUP"); break; // case WM_NCXBUTTONDBLCLK: // fprintf(stream, "WM_NCXBUTTONDBLCLK"); // break; // case WM_NCXBUTTONDOWN: // fprintf(stream, "WM_NCXBUTTONDOWN"); // break; // case WM_NCXBUTTONUP: // fprintf(stream, "WM_NCXBUTTONUP"); // break; case WM_RBUTTONDBLCLK: fprintf(stream, "WM_RBUTTONDBLCLK"); break; case WM_RBUTTONDOWN: fprintf(stream, "WM_RBUTTONDOWN"); break; case WM_RBUTTONUP : fprintf(stream, "WM_RBUTTONUP "); break; // case WM_XBUTTONDBLCLK: // fprintf(stream, "WM_XBUTTONDBLCLK"); // break; // case WM_XBUTTONDOWN: // fprintf(stream, "WM_XBUTTONDOWN"); // break; // case WM_XBUTTONU: // fprintf(stream, "WM_XBUTTONU"); // break; case WM_SETCURSOR: fprintf(stream, "WM_SETCURSOR"); break; default: fprintf(stream, "not listed %d", uMsg); break; } fprintf(stream, "\n"); return DefWindowProc(hwnd, uMsg, wParam, lParam); } */ /* LRESULT CALLBACK WindowProc (HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { HDC hdc; PAINTSTRUCT ps; RECT rect; HBRUSH hbrush, oldBrush; char buf[80]; COLORREF color;//=RGB(255, 0, 0); switch (uMsg) { case WM_PAINT: hdc=BeginPaint(hwnd, &ps); //color=RGB(count++, 0, 0); hbrush=CreateSolidBrush(color); oldBrush=(HBRUSH)SelectObject(hdc, hbrush); GetClientRect(hwnd, &rect); //SetBrushOrgEx(hdc, 10, 10, NULL); PatBlt(hdc, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, PATINVERT); SelectObject(hdc, oldBrush); sprintf(buf, "hello world!"); TextOut(hdc, 100, 100, buf, strlen(buf)); EndPaint(hwnd, &ps); return 0L; break; case WM_DESTROY: PostQuitMessage(0); return 0L; break; case WM_MOUSEACTIVATE: return MA_ACTIVATEANDEAT; break; //default: // return DefWindowProc(hwnd, uMsg, wParam, lParam); // break; case WM_NCCREATE: return TRUE; break; case WM_CREATE: return 0; break; case WM_NCACTIVATE: if (!wParam) { hdc = GetDC(hwnd); sprintf(buf, "WM_NCACTIVATE"); TextOut(hdc, 100, 180, buf, strlen(buf)); // Paint into this DC ReleaseDC(hwnd, hdc); return TRUE; } else { return FALSE; } break; case WM_ERASEBKGND: if (wParam!=NULL) { hdc=(HDC)wParam; color=RGB(count++, 0, 0); hbrush=CreateSolidBrush(color); oldBrush=(HBRUSH)SelectObject(hdc, hbrush); GetClientRect(hwnd, &rect); //SetBrushOrgEx(hdc, 10, 10, NULL); PatBlt(hdc, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, PATINVERT); SelectObject(hdc, oldBrush); } return 1L; break; } return 0L; } */ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { char szWinApp[]="szMyWinClass"; stream=fopen("mylog.txt", "w"); //fprintf(stream, "message begins:\n"); HWND hwnd; MSG msg; if (!hPrevInstance) { nWinWidth=GetSystemMetrics(SM_CXSCREEN)/2; nWinHeight=GetSystemMetrics(SM_CYSCREEN)/2; memset(&wndClass, 0, sizeof(WNDCLASS)); wndClass.lpszClassName=szWinApp; wndClass.style=CS_HREDRAW|CS_VREDRAW; wndClass.hInstance=hInstance; wndClass.lpfnWndProc=WindowProc; wndClass.cbClsExtra=wndClass.cbWndExtra=0; wndClass.hIcon=LoadIcon(NULL, IDI_APPLICATION); wndClass.hCursor=LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndClass.lpszMenuName=NULL; if (!RegisterClass(&wndClass)) { int err=GetLastError(); return FALSE; } } hwnd=CreateWindow(szWinApp, "My Window Test", WS_OVERLAPPEDWINDOW|WS_VISIBLE, 0, 0, nWinWidth, nWinHeight, NULL, NULL, hInstance, NULL); if (!hwnd) { int err=GetLastError(); return FALSE; } ShowWindow(hwnd, nShowCmd); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } fclose(stream); return msg.wParam; }