1, 得到HINSTANCE程序句柄
在WM_CREATE时,lParam是指向CREATESTRUCT结构的指针.
HINSTANCE instance = ((LPCREATESTRUCT)lParam)->hInstance;
HINSTANCE instance = GetWindowLong(hwnd, GWL_HINSTANCE);
2, 得到子窗口ID/HWND
int childID = GetWindowLong(childHwnd, GWL_ID);
int childID = GetDlgCtrlID(childHwnd);
HWND childHwnd = GetDlgItem(ParentHwnd, ID);
3, 按钮样式BS_ICON, BS_BITMAP, 设定位图消息BM_SETIMAGE
4, WM_VSCROLL/WM_HSCROLL消息 子控件滚动条lParam为0, 滚动条控件为句柄
5, 窗口子类化
WNDPROC oldProc = (WNDPROC)SetWindowLong(vscrollHwnd, GWL_WNDPROC, (long)ScrollProc);
LRESULT CALLBACK ScrollProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
//..
return CallWindowProc(oldProc, hwnd, msg, wParam, lParam);
}
6, 数据强制转换
#define MAKEINTRESOURCE( i) (LPTSTR) ((DWORD) ((WORD) ( i)))
(char *)((unsigned long)((unsigned short)(i)));
unsigned short是去掉最高位,只要低位2字节
unsigned long转回占4字节
(char *)(3) == 00000000 00000011;
7, 在现代汉语中,许多词的重点都在后面
数组指针 后面为指针, 即int (*p)[3]
指针数组 后面为数组, 即int *p[3];
函数指针 后面为指针, 即int (*swap)(int)
指针函数 后在为函数, 即int *swap(int a)
8, 数组做函数参数时, 失去数组属性, 成为指针.
void sw(int a[3])
{
a++;
sizeof(a) == 4;
}
9, 二进制数对应位最大数值
8位 256 byte
10位 1024 byte/1kb
16位 65536 byte/64kb
20位 1 MB
30位 1 G
32位 4 G
10, 创建窗口菜单三种方法, 1,窗口类别中指定; 2,在CreateWindow()第九个参数指定; 3,创建窗口后,用SetMenu(HWND, HMENU)函数指定 (这种与窗口无关的创建方法,程序结束时应该用DestroyMenu()清除
11, SetWindowLong()/GetWindowLong()
GWL_EXSTYLE 设置窗口的扩展风格.
GWL_STYLE 设置新的窗口风格
GWL_WNDPROC 设置新的窗口处理函数地址
GWL_HINSTANCE 设置新的应用程序句柄
GWL_ID 设置新的窗口标识
GWL_USERDATA 设置一个与这个窗口相关的给用户使用的32位的数据
12, 对话框程序,如果WM_INITDIALOG消息函数返回是true则按WS_TABSTOP第一个控件得到焦点.
如果WM_INITDIALOG消息函数返回是false,如果设置了某控件得到focus,则某控件得到第一个焦点.如果没有设置,则和true结果一样,WS_TABSTOP第一个控件得到焦点.
13, 静态类成员变量, 必须在类外赋初值/申明
14, 全局变量必须在.cpp里申明.不能放在.h申请,防止全局变量被包含多次