这一次主要是记录了资源文件的运用,我们知道,再VS中新建Win32项目不把空项目勾上的话会自动帮用户把WinMain和窗口过程全部生成好,并且也会默认为资源文件添加About,Menu,还有图标都生成好,挺方便,那么这次我学习到的是Windows程序设计第五版,所使用的IDE和我的不同,并且比较老旧,但是由于里面有一些东西还是有一定的学习价值,所以这里还是以笔记的形式记录下来。
先来看我创建的一个项目的窗口类赋值方式:
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32LEARNRC));
wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WIN32LEARNRC);
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassExW(&wcex);
}
我们发现,这里有一个点就和我们之前的WINDCLASS不同,就是这里的类是WNDCLASSEXs,在书上也有介绍过这中窗口类,这个窗口类相比于原来的窗口类多了两个域:cbSize和hIconSm,第一个域再之前的PS类有说过,方便更新的时候保证兼容性的,后面的那一个则是一个小的图标图像,在书里,认为用这个类是没有必要的(是用这个类的话相应的,注册窗口类的函数就应该是RegsiterClassEx)
之后我们看见不同点又来了,就是图标和窗口名称并且这次添加了一个菜单,菜单之后再说,先说图标和窗口名称,可以发现,MAKEINTRESOURCE()里面跟的东西是一个宏定义,说白了就是一个数字,然而,这个宏(MAKEINTRESOURCE)的作用就是把指针改为资源串(一个指向非数字的指针,说白了就是把那个值变为一个指针罢了。。)其实,把resource.h文件里面的宏定义删了以后,直接用这玩意当字符串也可以,当然,你也可以改个名字让它显得更直观。。。。。
之后是光标,这玩意我们也可以自己画一个,也可以自己添加一个,同时可以用SetClassLong来修改光标,为每一个类都设置不同的光标
之后值得注意的是我们的ClassName,这里的ClassName同样的也是存在与资源文件里面的:
LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadStringW(hInstance, IDC_WIN32LEARNRC, szWindowClass, MAX_LOADSTRING);
最后一个是自定义资源,比如文本什么的,在添加资源里面然后选择自定义然后在自定义的资源类里面添加点导入想要的文本文件即可,这个文本文件可以拿来显示输出:
先调用LoadResorece(hInstance,FindResource(hInstance,自定义资源类型名,自定义资源标识);然后存入一个HGLOBL中,由LockResource获取文本内容的地址,最后由FreeResource释放。
在书中的例程有这一段:
case WM_CREATE :
hdc = GetDC (hwnd) ;
GetTextMetrics (hdc, &tm) ;
cxChar = tm.tmAveCharWidth ;
cyChar = tm.tmHeight + tm.tmExternalLeading ;
ReleaseDC (hwnd, hdc) ;
xScroll = GetSystemMetrics (SM_CXVSCROLL) ;
hScroll = CreateWindow (TEXT ("scrollbar"), NULL,
WS_CHILD | WS_VISIBLE | SBS_VERT,
0, 0, 0, 0,
hwnd, (HMENU) 1, hInst, NULL) ;
hResource = LoadResource (hInst,
FindResource (hInst, TEXT ("AnnabelLee"),
TEXT ("TEXT"))) ;
pText = (char *) LockResource (hResource) ;
iNumLines = 0 ;
while (*pText != '\\' && *pText != '\0')
{
if (*pText == '\n')
iNumLines ++ ;
pText = AnsiNext (pText) ;
}
*pText = '\0' ;
SetScrollRange (hScroll, SB_CTL, 0, iNumLines, FALSE) ;
SetScrollPos (hScroll, SB_CTL, 0, FALSE) ;
return 0 ;
这里作者将实例句柄存为全局直接调用,同时之前的笔记中说过在WM_CREATE中的lParam参数其实是一个指向CREATESTRUCT结构的指针,其中包含了一个实例句柄。