我在c ++中有一个关于全局变量和对象清理的问题.
例如,看看这里的代码;
case WM_PAINT:
paintText(&hWnd);
break;
void paintText(HWND* hWnd) {
PAINTSTRUCT ps;
HBRUSH hbruzh = CreateSolidBrush(RGB(0,0,0));
HDC hdz = BeginPaint(*hWnd,&ps);
char s1[] = "Name";
char s2[] = "IP";
SelectBrush(hdz,hbruzh);
SelectFont(hdz,hFont);
SetBkMode(hdz,TRANSPARENT);
TextOut(hdz,3,23,s1,sizeof(s1));
TextOut(hdz,10,53,s2,sizeof(s2));
EndPaint(*hWnd,&ps);
DeleteObject(hdz);
DeleteObject(hbruzh); // bad?
DeleteObject(ps); // bad?
}
Run Code Online (Sandbox Code Playgroud)
1)首先; 删除哪些对象以及哪些对象不适合删除?为什么?不是100%肯定这一点.
2)由于每次重绘窗口时都会调用WM_PAINT,将ps,hdz和hbruzh存储为全局变量而不是每次都重新初始化它会更好吗?我认为最终的缺点是大量的全局变量> _>但性能方面是否会消耗更少的CPU?我知道这并不重要,但我只是为了教育目的而尽可能简约.
3)加载的库怎么样?例如:
//
// Main
//
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
// initialize vars
HWND hWnd;
WNDCLASSEX wc;
HINSTANCE hlib = LoadLibrary("Riched20.dll");
ThishInstance = hInstance;
ZeroMemory(&wc,sizeof(wc));
// set WNDCLASSEX props
wc.cbSize = sizeof(WNDCLASSEX);
wc.lpfnWndProc = WindowProc;
wc.hInstance = ThishInstance;
wc.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_MYICON));
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
wc.lpszClassName = TEXT("PimpClient");
RegisterClassEx(&wc);
// create main window and display it
hWnd = CreateWindowEx(NULL,
wc.lpszClassName,
TEXT("PimpClient"),
0,
300,
200,
450,
395,
NULL,
NULL,
hInstance,
NULL);
createWindows(&hWnd);
ShowWindow(hWnd,nCmdShow);
// loop message queue
MSG msg;
while (GetMessage(&msg, NULL,0,0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
// cleanup?
FreeLibrary(hlib);
return msg.wParam;
}
Run Code Online (Sandbox Code Playgroud)
3cont)FreeLibrary到底有没有理由?我的意思是当进程终止时,所有资源都被释放了?由于该库用于在整个程序中绘制文本,为什么我要在此之前释放?
干杯
1.-您应删除为其创建HANDLE的所有对象.如果对象是使用WIN32函数创建的,则应使用另一个WIN32函数释放它.PAINTSTRUCT是在堆栈上创建的变量,因此在函数范围结束时将删除它.
2.-有一条规则说:声明一个变量就像你使用它一样近.公共变量模糊了代码.
3.-如果文档说您需要释放资源,那么您必须这样做以避免意外结果:http://msdn.microsoft.com/en-us/library/aa923590.aspx.
在Windows程序设计,查尔斯Petzold的书是编程的WIN32 API最完整的指南之一:http://www.charlespetzold.com/books.html.
公共变量的另一种方法是在WM_CREATE消息上创建GDI对象,并在WM_DESTROY消息上释放它们:
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static HBRUSH hBrushRed;
HDC hdc;
PAINTSTRUCT ps;
switch (message)
{
case WM_CREATE: hBrushRed = CreateSolidBrush (RGB (255, 0, 0)) ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
/* .. use gdi objects ... */
SelectObject (hdc, GetStockObject (NULL_PEN)) ;
SelectObject (hdc, hBrushRed) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
DeleteObject (hBrushRed) ;
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
Run Code Online (Sandbox Code Playgroud)