📄 mainwndproc.cpp
字号:
// fileName: mainWndProc.cpp
// by: zhnyong@21cn.com
// 该文件为主窗口的各种处理子过程,是实现窗口功能自定义的过程
// 包括自定义头文件
#include "myFileManagement.h"
// 定义全局变量程序实例句柄
HINSTANCE hInst;
// 定义全局常量消息号ID与消息处理过程指针查找表
const MessageProc mainMessages[]=
{
WM_CREATE, goCreateMain,
WM_PAINT, goPaintMain,
WM_DESTROY, goDestroyMain,
WM_CLOSE, goCloseMain,
WM_COMMAND, goCommandMain,
WM_ACTIVATE, goActivateMain,
};
// 定义命令栏图标按钮
const TBBUTTON tbBtns[]=
{ //索引号, 命令ID,与菜单相同, 状态, 样式, 用户数据, 标题字符串
{0, IDM_OPENTEXTFILE, TBSTATE_ENABLED, TBSTYLE_BUTTON , 0, 0},
{1, IDM_SAVETEXTFILE, TBSTATE_ENABLED, TBSTYLE_BUTTON , 0, 0},
};
// 注册窗口类
int registerWnd(HINSTANCE hInstance)
{
// 定义窗口类结构体对象
WNDCLASS wc;
// 定义装入通用控件结构体
//INITCOMMONCONTROLSEX icex;
// 填充结构体中的各元素
wc.hInstance = hInstance;
wc.lpszClassName = mainClassName;
wc.lpfnWndProc = mainWndProc;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.style = CS_DBLCLKS;
wc.hIcon = NULL;
wc.hCursor = NULL;
wc.lpszMenuName = NULL;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
// 注册窗口类
if(!RegisterClass(&wc))
return 0;
// 注册子窗口fileChildWnd
if(!registerFileChildWnd(hInstance))
return 0;
return 1;
}
// 创建并显示窗口
int showMainWnd(HINSTANCE hInstance,LPWSTR lpCmdLine, int nShowCmd)
{
// 定义窗口句柄
HWND hWnd;
// 存储全局程序实例句柄
hInst = hInstance;
// 创建窗口
hWnd = CreateWindow( mainClassName,
TEXT("文件管理"),
WS_VISIBLE,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
// 如果窗口创建不成功,返回0退出
if(!IsWindow(hWnd))
return 0;
// 显示窗口,并刷新窗口
ShowWindow(hWnd,nShowCmd);
UpdateWindow(hWnd);
return 1;
}
// 退出主窗口
int quitMainWnd(HINSTANCE hInstance, int nExitCode)
{
return nExitCode;
}
// 主窗口过程体,窗口过程必须为回调函数
LRESULT CALLBACK mainWndProc(HWND hWnd, UINT msgCode, WPARAM wParam, LPARAM lParam)
{
INT i;
// 查找对应的消息ID号,并执行相应的消息处理过程
for(i=0; i<dim(mainMessages);i++)
{
if(msgCode==mainMessages[i].uCode)
return (*mainMessages[i].functionName)(hWnd,msgCode,wParam,lParam);
}
// 对于不在消息查找表中的消息,调用Windows CE的缺省窗口过程
return DefWindowProc(hWnd, msgCode, wParam, lParam);
}
// 主窗口收到WM_CREATE消息后的处理过程体
LRESULT goCreateMain(HWND hWnd, UINT msgCode, WPARAM wParam, LPARAM lParam)
{
// 定义命令栏窗口和一个子窗口句柄
HWND wndCB,wndFileChild;
// 定义图标句柄
HICON hIcon;
// 定义CREATESTRUCT结构体指针
LPCREATESTRUCT lpcs;
// 定义图像列表句柄
HIMAGELIST imageList;
// 定义五个整型量,分别存放命令栏高度和要创建的子窗口的左上角位置及宽和高
int cmdHeight, x, y, xw, yh;
// 取得程序当前图标,如果不存在,则使用图标资源设定程序图标
hIcon = (HICON)SendMessage(hWnd,WM_GETICON,ICON_BIG,0);
if(hIcon==0)
{
hIcon = (HICON)LoadImage(hInst,MAKEINTRESOURCE(ID_ICON),IMAGE_ICON,32,32,0);
SendMessage(hWnd,WM_SETICON,ICON_BIG,(LPARAM)hIcon);
}
// 从WM_CREATE消息参数lParam中取得lpcs
lpcs = (LPCREATESTRUCT)lParam;
// 获得要创建的主窗口的左上角位置及宽和高
x=lpcs->x;
y=lpcs->y;
xw=lpcs->cx;
yh=lpcs->cy;
// 创建命令栏工具条
wndCB = CommandBar_Create(hInst,hWnd,IDC_CMDBAR);
// 在命令栏窗口中插入菜单
CommandBar_InsertMenubar(wndCB,hInst,ID_MENU,0);
// 在命令栏中列表中添加图标容器
CommandBar_AddBitmap(wndCB, hInst, ID_OPENFILEICON,1,16,16);
CommandBar_AddBitmap(wndCB, hInst, ID_SAVEFILEICON,1,16,16);
// 将图像列表与命令栏图标容器相关联
imageList = (HIMAGELIST)SendMessage(wndCB, TB_GETIMAGELIST, 0,0);
// 向图像列表添加二个图标
hIcon =(HICON)LoadImage(hInst,MAKEINTRESOURCE(ID_OPENFILEICON),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
ImageList_AddIcon(imageList,hIcon);
hIcon =(HICON)LoadImage(hInst,MAKEINTRESOURCE(ID_SAVEFILEICON),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
ImageList_AddIcon(imageList,hIcon);
DeleteObject(hIcon);
// 在命令栏中添加二个按钮与二个图标相对应
CommandBar_AddButtons(wndCB,2,tbBtns);
// 在命令栏添加Close按钮
CommandBar_AddAdornments(wndCB,0,0);
// 获得命令栏的高度
cmdHeight = CommandBar_Height(wndCB);
// 在当前窗口hWnd中创建子窗口,左上角为(x,cmdHeight),宽为xw,高为yh-2*cmdHeight
wndFileChild = CreateWindow(strFileChildClassName,
TEXT(""),
WS_VISIBLE | WS_CHILD,
x,
cmdHeight,
xw,
yh-2*cmdHeight,
hWnd,
(HMENU)IDW_FILECHILD,
hInst,
NULL);
// 如果创建子窗口失败,则关闭主窗口退出程序
if(!IsWindow(wndFileChild))
{
DestroyWindow(hWnd);
return 0;
}
// 在主窗口上面显示子窗口
ShowWindow(wndFileChild,SW_SHOW);
return 0;
}
// 主窗口收到WM_DESTROY消息后的处理过程体
LRESULT goDestroyMain(HWND hWnd, UINT msgCode, WPARAM wParam, LPARAM lParam)
{
// 向主窗口发送WM_QUIT消息,并把0传给msg.wParam
PostQuitMessage(0);
return 0;
}
// 主窗口收到WM_CLOSE消息后的处理过程体
LRESULT goCloseMain(HWND hWnd, UINT msgCode, WPARAM wParam, LPARAM lParam)
{
INT idCode;
// 弹出带有YES和NO控件的简单消息对话框
idCode = MessageBox(hWnd,TEXT("退出程序吗?"),TEXT("退出"),MB_YESNO | MB_ICONQUESTION);
// 如果点击NO则返回0,单击YES则退出
if(idCode == IDNO)
return 0;
PostQuitMessage(0);
return 0;
}
// 主窗口收到WM_PAINT消息后的处理过程体
LRESULT goPaintMain(HWND hWnd, UINT msgCode, WPARAM wParam, LPARAM lParam)
{
return 0;
}
// 主窗口收到WM_COMMAND消息后的处理过程体
LRESULT goCommandMain(HWND hWnd,UINT msgCode, WPARAM wParam, LPARAM lParam)
{
// 定义字变量menuID
WORD menuID;
// 获得菜单ID号
menuID = (WORD)LOWORD(wParam);
if(menuID == IDM_EXIT)
{
// 向主窗口发送WM_CLOSE消息
SendMessage(hWnd,WM_CLOSE,0,0);
}
else
{
// 向子窗口发送自定义消息MYWM_MENUCLICK,该消息的二个参数即为WM_COMMAND的二个参数
SendMessage(GetDlgItem(hWnd,IDW_FILECHILD),MYWM_MENUCLICK,wParam,lParam);
}
return 0;
}
// 主窗口收到WM_ACTIVATE消息后的处理过程体
LRESULT goActivateMain(HWND hWnd,UINT msgCode,WPARAM wParam,LPARAM lParam)
{
// 定义窗口句柄
HWND wndFileChild;
// 获得子窗口
wndFileChild = GetDlgItem(hWnd,IDW_FILECHILD);
// 刷新主窗口
UpdateWindow(hWnd);
// 在主窗口上面显示子窗口
ShowWindow(wndFileChild,SW_SHOW);
// 刷新子窗口
UpdateWindow(wndFileChild);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -