這一次主要是記錄了資源文件的運用,我們知道,再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結構的指針,其中包含了一個實例句柄。