day07

5.在收到WM_CONTEXTMENU消息时弹出右键菜单
wParam - 被点击的窗口句柄
lParam - LOWORD (鼠标水平位置) HIWORD (鼠标垂直位置),都是屏幕座标,无需做ClientToScreen的转换.


一、菜单资源
1.添加菜单资源
2.通过窗口类加载菜单资源
3.通过CreateWIndow/CreateWindowEx函数加载菜单资源
LoadMenu (hInstance, MAKEINTRESOURCE (IDR_MENU_MAIN))
4.动态切换菜单资源


二、图标资源
1.添加图标资源
2.加载图标资源
1)注册窗口类式加载
typedef struct{
...
HICON hIcon; //大图标句柄
HICON hIconSm; //小图标句柄
...
}WNDCLASSEX;
HICON LoadIcon (
HINSTANCE hInstance, //应用程序实例句柄
LPCTSTR lpIconName //图标资源名
)
成功返回图标资源句柄,失败返回NULL


2)动态设置窗口图标
WM_SETICON - 向窗口发送此消息以设置图标
wParam - 图标类型ICON_BIG/ICON_SMALL
lParam - 图标句柄


3.绘制图标
BOOL DrawIcon (
HDC hDC, //设备上下文
int xLeft, //左上角
int yTop, //图标位置 右下角位置
HICON hIcon, //图标句柄
);
成功返回TURE,失败返回FALSE


BOOL DrawIconEx (
HDC hDC, //设备上下文
int xLeft, //左上角
int yTop, //图标位置 右下角位置
HICON hIcon, //图标句柄
int cxWidth,
int cyHeight, //图标宽度和高度
UINT istepIfAniCur, //不支持动画,置为0
HBRUSH hbrFlickerFreeDraw, //由系统直接绘制图标,置为NULL
UINT diFlags //绘制标志
//DI_NORMAL/DI_IMAGE/DI_MASK
// 正常/图像/掩码
);


 0X00bbggrr


白:255,255,255 - 0X00FFFFFF
黑:0,0,0, - 0X00000000
蓝:0,255,0 - 0X00FF0000
黄:255,255,0 - 0X0000FFFF
1 & x = X --> w & c = c
1 | x = 1 --> w | c = w
0 & x = 0 --> b & c = b
0 | x = x --> b | c = c


先 & 后 |


DI_MASK &
DI_IMAGE |
ROP概念:
光山操作:






三、光标资源
1.添加光标资源
光标的默认大小32*32像素,每一个光标都有一个热点(HotSpot),即鼠标的位置点
2.加载光标资源
HCURSOR LoadCursor (
HINSTNACE hInstance, //应用程序实例句柄
LPCTSTR pszCursorName //光标资源名
);
成功返回光标句柄,失败返回NULL.


typedef struct {
...
HCURSOR hCursor; //光标句柄
...
}WNDCLASSEX;
根据此窗口类创建的所有窗口都使用了此光标
3.动态设置窗口光标
WM_SETCURSOR - 设置光标(有鼠标动作且未被捕获时发送此消息)
在该消息的处理过程中通过SetCursor 函数设置光标


HCURSOR SetCursor (
HCURSOR hCursor //光标句柄
);
返回原光标,无原光标则返回NULL.
wParam - 当前光标句柄
lParam - LOWORD 当前区域代码,可以据此判断鼠标是在客户区中在标题栏中,或其他区域
HIWORD当前鼠标消息ID




4.从文件中加载光标
HCURSOR LoadCursorFromFile (
LPCTSTR lpFileName //光标文件路径
);
成功返回光标句柄,失败返回NULL.
对于动画光标只能通过文件加载
C:\WINDOWS\Cursors\dinosaur.ani
如果在程序中加入路径要不就使用 \\ 或者 /


如果是.ani结尾的光标是动态光标
如果是.cur结尾的光标是静态光标


5.字符串资源
1.添加资源
添加字符串表资源,在表中添加字符串.
2.加载字符串资源
int LoadString (
HINSTNACE hInstance, //应用程序实例句柄
UINt uID //字符串ID
LPTSTR lpBuffer //字符串缓冲区
int cchBufferMax //缓冲区大小
);
成功返回实际载入lpBuffer缓冲区中的字符个数(不包含结尾空字符)
失败返回0
五、加速键
1.添加加速键表资源
添加加速键表资源,添加与命令ID相对应的加速键
2.加载加速键资源
HACCEL LoadAccelerators (
HINSTANCE hInstance, //应用程序的实例句柄
LPCTSTR lpTableName //加速键表资源名
);
成功返回加速键表句柄,失败返回NULL
3.翻译加速键消息
int TranslateAccelerator (
HWND hWnd, //窗口句柄
HACCEL hAcctable, //加速键表的资源句柄
LPMSG lpMsg //消息结构体
);
成功(翻译了)返回非零,失败(未翻译)返回0


int TranslateAccelerator (
HWND hWnd,
HACCEL hAcctable,
LPMSG lpMsg
)
{
if (lpMsg->Message == WM_KEYDOWN || lpMsg->Message == WM_SYSKEYDOWN)
{
从lpMsg中提取按键信息;
if(hAccTable加速键表中存在与所按下键对应的命令ID)
{
PostMessage (hWnd, WM_COMMAND, MAKELONG(命令ID, 1), 0);
return 1;
}
}
return 0;
}
MAKELONG 将两个16位组成一个32位


消息循环 
MSG msg = {0};
while (GetMessage (&msg, NULL, 0, 0)) {
if (TranslateAccelereator (msg.hWnd, hAccTable, &msg) {
TranslateMessage (&msg);
DispatchMessage (&msg);
}
}


4.独立于菜单的加速键消息
WM_COMMAND - 命令消息
wParam - HIWORD菜单0/加速键1/控件通知码
 LOWORD菜单ID/加速键ID/控件ID
lParam  若发自控件则为其句柄,否则为NULL


六、版本资源





































發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章