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;
}