读书人

很基础的WinSDK的有关问题:关于屏幕上

发布时间: 2012-01-29 21:39:32 作者: rapoo

很基础的WinSDK的问题:关于屏幕上画直线和写文字
如下函数,用BoundsChecker检查,总内存泄露,请指点一二,不胜感激。
分不多,见谅!

VOID DrawRestWindow(HDC hdc)
{
RECT rect;
HFONT hfont, hfontold;
LOGFONT lf;
TCHARszFont[MAX_PATH];
// 读取字体和大小
CIniFile::ReadString(TEXT( "HEALTH-OPTION "), TEXT( "FontName "), szFont, MAX_PATH, TEXT( "Arial "));
UINT iFontSize = CIniFile::ReadInteger(TEXT( "HEALTH-OPTION "), TEXT( "FontSize "), 0);
// 写入字体及大小
CIniFile::WriteString(TEXT( "HEALTH-OPTION "), TEXT( "FontName "), szFont);
CIniFile::WriteInteger(TEXT( "HEALTH-OPTION "), TEXT( "FontSize "), iFontSize);
// 读取颜色
COLORREF crLColor = CIniFile::ReadInteger(TEXT( "HEALTH-OPTION "), TEXT( "LineColor "), 255);
COLORREF crTColor = CIniFile::ReadInteger(TEXT( "HEALTH-OPTION "), TEXT( "TextColor "), 16711680);
// 读取提醒文字
TCHAR szText[MAX_BUFFER_SIZE];
CIniFile::ReadMultiString(TEXT( "HEALTH-OPTION "), TEXT( "WindowText "), szText, MAX_BUFFER_SIZE, TEXT( " "));
// 读取界面参数
UINT iAlpha= CIniFile::ReadInteger(TEXT( "HEALTH-OPTION "), TEXT( "WindowAlpha "), 98);
UINT iXpos= CIniFile::ReadInteger(TEXT( "HEALTH-OPTION "), TEXT( "TextXPosition "), 100);
UINT iYpos= CIniFile::ReadInteger(TEXT( "HEALTH-OPTION "), TEXT( "TextYPosition "), 100);
if (iAlpha < 96 || iAlpha > 100)
{
iAlpha = 98;
CIniFile::WriteInteger(TEXT( "HEALTH-OPTION "), TEXT( "WindowAlpha "), iAlpha);
}
// 透明背景
CThransparenceWnd ThranWnd;
ThranWnd.SetHandle(g_hWnd);
ThranWnd.SetAlpha(iAlpha*255/100);
// 初始化字体
lf.lfHeight = iFontSize;
lf.lfWidth = 0;
lf.lfEscapement = 0;
lf.lfOrientation = 0;
lf.lfWeight = 0;
lf.lfItalic = 0;
lf.lfUnderline = 0;
lf.lfStrikeOut = 0;
lf.lfCharSet = DEFAULT_CHARSET;
lf.lfOutPrecision = 0;
lf.lfClipPrecision = 0;


lf.lfQuality = ANTIALIASED_QUALITY;
lf.lfPitchAndFamily = 0;
lstrcpy(lf.lfFaceName, szFont);
// 屏幕大小
UINT ixScreen = GetSystemMetrics(SM_CXSCREEN);
UINT iyScreen = GetSystemMetrics(SM_CYSCREEN);
BOOL bDayTimeOut = CIniFile::ReadInteger(TEXT( "HEALTH-OPTION "), TEXT( "DayTimeOut "), 0);
if (bDayTimeOut)
{
// 画超总限时提示
hfont = CreateFontIndirect(&lf);
SetRect(&rect, iXpos, iYpos, ixScreen, iyScreen-50);
hfontold = (HFONT)SelectObject(hdc, hfont);
SetTextColor(hdc, crTColor);
SetBkMode(hdc, TRANSPARENT);
szText[0] = 0;
wsprintf(szText, STR_Count_DayTimeOut, (int)(g_iTotalTime/3600));
DrawText(hdc, szText, lstrlen(szText), &rect, DT_WORDBREAK);
}
else
{
// 画文字
hfont = CreateFontIndirect(&lf);
SetRect(&rect, iXpos, iYpos, ixScreen, iyScreen-50);
hfontold = (HFONT)SelectObject(hdc, hfont);
SetTextColor(hdc, crTColor);
SetBkMode(hdc, TRANSPARENT);
DrawText(hdc, szText, lstrlen(szText), &rect, DT_WORDBREAK);
// 画进度条
UINT iRestDecuple = g_iRestTime * 10;
UINT iPos = URLWIDTH + (UINT)((1 - (float)g_iRestElapse/iRestDecuple) * (ixScreen - URLWIDTH));
HPEN hPen = CreatePen(PS_SOLID, 1, crLColor);
SelectObject(hdc, hPen);
MoveToEx(hdc, URLWIDTH, iyScreen-15, NULL);
LineTo(hdc, iPos, iyScreen-15);
DeleteObject(hPen);
}
// 画网址
lf.lfHeight = 22;
lf.lfWeight = 800;
lstrcpy(lf.lfFaceName, TEXT( "Comic Sans MS "));
hfont = CreateFontIndirect(&lf);
SetRect(&rect, 5, iyScreen-28, 88, iyScreen);
hfontold = (HFONT)SelectObject(hdc, hfont);
SetTextColor(hdc, crLColor-100);
SetBkMode(hdc, TRANSPARENT);
DrawText(hdc,TEXT( "aaa.com "), -1, &rect, DT_LEFT);
}


[解决办法]
听楼上的,没错!
[解决办法]
所有你过的gdi对象都要deleteobject
还有dc,也要delete掉
[解决办法]
...
lf.lfQuality = ANTIALIASED_QUALITY;
lf.lfPitchAndFamily = 0;
lstrcpy(lf.lfFaceName, szFont);
//把所有创建字体和笔的都放在这里
hfont = CreateFontIndirect(&lf);
hPen = CreatePen(PS_SOLID, 1, crLColor);
...
if ()
{
}
else
{
}
...
SelectObject(hdc, holdFont);
SelectObject(hdc, holdPen);
DeleteObject(hFont);
DeleteObject(hPen);
ReleaseDC(g_hwnd, hdc);

读书人网 >VC/MFC

热点推荐