首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

很基础的WinSDK的有关问题:关于屏幕上画直线和写文字

2012-01-29 
很基础的WinSDK的问题:关于屏幕上画直线和写文字如下函数,用BoundsChecker检查,总内存泄露,请指点一二,不

很基础的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);

热点排行