#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;//首先是一个回调函数的声明
int WINAPI WinMain (HINSTANCE hInstance, //应用程序当前实例的句柄
HINSTANCE hPrevInstance,//应用程序先前的实例句柄
PSTR szCmdLine, //指向应用程序命令行的字符串的指针
int iCmdShow)//指明窗口如何显示
{
TCHAR szAppName[] = TEXT ("IconDemo") ;
HWND hwnd ;//当前实例的句柄
MSG msg ;//消息
WNDCLASS wndclass ;//类名
wndclass.style = CS_HREDRAW | CS_VREDRAW ;//窗口的显示方式,此处为水平重画和竖直重画
wndclass.lpfnWndProc = WndProc ;//窗口回调函数
wndclass.cbClsExtra = 0 ;//窗口扩展,此处为0
wndclass.cbWndExtra = 0 ;//窗口实例扩展,此处为0
wndclass.hInstance = hInstance ;//窗口的实例句柄
wndclass.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON)) ;
//LoadIcon函数加载指定与一个应用程序实例相关联的图标资源的可执行文件(. exe)
//MAKEINTRESOURCE是一个资源名转换的宏,这个宏是把一个数字类型转换成指针类型的宏
//是把一个"数字形ID",转化为"字符串
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;//鼠标的显示方式,此处设置为标准型
wndclass.hbrBackground = GetStockObject (WHITE_BRUSH) ;//窗口背景颜色的设置,此处设置为白色
wndclass.lpszMenuName = NULL ;//窗口菜单,此处没菜单设为NULL
wndclass.lpszClassName = szAppName ;//窗口类名
if (!RegisterClass (&wndclass))//注册窗口,若注册失败,产生如下的信息
{
MessageBox (NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ;
return 0 ;
}
创建窗口,如果函数成功,返回值为新窗口的句柄:如果函数失败,返回值为NULL
hwnd = CreateWindow (szAppName,
TEXT ("Icon Demo"),//窗口的名字
WS_OVERLAPPEDWINDOW,//指定创建窗口的风格
CW_USEDEFAULT,//指定窗口的初始水平位置
CW_USEDEFAULT,//指定窗口的初始垂直位置
CW_USEDEFAULT, //以设备单元指明窗口的宽度。若是CW_USEDEFAULT,则系统为窗口选择一个缺省的宽度
CW_USEDEFAULT,//以设备单元指明窗口的高度
NULL,//指向被创建窗口的父窗口或所有者窗口的句柄,此处为NULL
NULL,//菜单句柄,或依据窗口风格指明一个子窗口标识,此处为NULL
hInstance,//与窗口相关联的模块实例的句柄。
NULL) ;//指向一个值的指针,该值传递给窗口WM_CREATE消息
ShowWindow (hwnd, iCmdShow) ;//显示窗口,hWnd:指窗口句柄。iCmdShow:指定窗口如何显示
UpdateWindow (hwnd) ;//更新窗口,hWnd:指窗口句柄
while (GetMessage (&msg, NULL, 0, 0))//消息循环
{
TranslateMessage (&msg) ;//该函数将虚拟键消息转换为字符消息
DispatchMessage (&msg) ;//该函数分发一个消息给窗口程序
}
return msg.wParam ;//wParam是消息携带的参数,可以是个值,也可以是个地址
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HICON hIcon ;//定义一个图标的句柄
static int cxIcon, cyIcon, cxClient, cyClient ;
HDC hdc ;//句柄
HINSTANCE hInstance ;
PAINTSTRUCT ps ;//该结构体包含了某应用程序用来绘制它所拥有的窗口客户区所需要的信息
int x, y ;
switch (message)
{
case WM_CREATE :
hInstance = ((LPCREATESTRUCT) lParam)->hInstance ;
hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON)) ;
cxIcon = GetSystemMetrics (SM_CXICON) ;
cyIcon = GetSystemMetrics (SM_CYICON) ;
//GetSystemMetrics用于得到被定义的系统数据或者系统配置信息
//SM_CXICON,SM_CYICON 系统缺省的图标的高度和宽度(一般为32*32)
return 0 ;
case WM_SIZE :
cxClient = LOWORD (lParam) ;//获取窗口宽度
cyClient = HIWORD (lParam) ;//获取窗口高度
return 0 ;
case WM_PAINT :
hdc = BeginPaint (hwnd, &ps) ;//获取环境句柄
for (y = 0 ; y < cyClient ; y += cyIcon)
for (x = 0 ; x < cxClient ; x += cxIcon)
DrawIcon (hdc, x, y, hIcon) ;
//DrawIcon函数在限定的设备上下文窗口的客户区域绘制图标
//hIcon被绘制图标的句柄
EndPaint (hwnd, &ps) ;//释放环境句柄
return 0 ;
case WM_DESTROY :
PostQuitMessage (0) ;//该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;//该函数调用缺省的窗口过程来为应用程序没有处理的任何窗口消息提供缺省的处理
}
该函数如果直接编译的话会报错,因为开头的resources.h文件还不存在,这时候我们应该在项目中加入一个资源脚本来做,首先在file中选择new,然后在files下面选择resources script(资源脚本),写入文件名,然后ok。这时候Developer Studio里面就有了一个.RC文件了,然后就可以编辑资源了,选择相应的类型然后就可以了,注意名字一定要上下一致,要和代码里面的保持一致否则会出错。下面是图片
Windows学习心得【自定义光标】
最新推荐文章于 2023-04-02 13:57:36 发布