界面花了,桌面也花了

Ryan76 2003-12-09 09:18:45
做一个消息提示的程序,程序运行时提示的消息在界面上滚动
界面是一个DIALOG,现在出现的问题是运行一段时间后1小时
左右吧,在点击程序界面,界面就花了,左面跟着一样花了,
拖着一晃所到之处全花了,把桌面刷新一下,比如某个程序最大化最小化一下
就好了,可是一点应用又乱了
下面是我怀疑出问题的一段代码,请大家看看是那里的问题
或是问题在别的地方

// WM_LBUTTONDOWN WM_MOUSEMOVE 处理窗口移动
case WM_LBUTTONDOWN:
OldPT.x = MAKEPOINTS( lParam).x ;
OldPT.y = MAKEPOINTS( lParam).y ;
SetCapture (hDlg);
isMouseDown = true;
break;

case WM_LBUTTONUP:
if (isMouseDown)
{
ReleaseCapture ();
isMouseDown = false;
SetCursor(pClient->ArrowCursor);
}
break;

case WM_MOUSEMOVE:
if (wParam & MK_LBUTTON)
{
SetCursor(pClient->SizeAllCursor);

NewPT.x = MAKEPOINTS( lParam).x;
NewPT.y = MAKEPOINTS( lParam).y ;

MoveWindow(hDlg,
pClient->BarLeft+(NewPT.x-OldPT.x),
pClient->BarTop+(NewPT.y-OldPT.y),
pClient->BarWidth,
pClient->BarHeight,
TRUE
);
pClient->BarLeft=pClient->BarLeft+(NewPT.x-OldPT.x); //记下新的Left,Top坐标
pClient->BarTop=pClient->BarTop+(NewPT.y-OldPT.y);
}

break;

case WM_CREATE:
{
short i ;

// inserting the text and the image
for( i = 0; i < MAXCOLORS; ++i)
{
ModifyMenu( pClient->hpopup,
items[ i].wMenuID,
MF_OWNERDRAW,
items[ i].wMenuID,
NULL) ;
}
}
break ;
...全文
44 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ISunwu 2003-12-09
  • 打赏
  • 举报
回复
呵呵。恭喜楼主。
Ryan76 2003-12-09
  • 打赏
  • 举报
回复
我查到原因了 CreateSolidBrush没有删除释放
HBRUSH brush=(HBRUSH)CreateSolidBrush(MyBkColor);
FillRect(hdc,&rect,brush);
DeleteObject(brush);
ross33123 2003-12-09
  • 打赏
  • 举报
回复
这就好办了CreateSolidBrush(MyBkColor) 创建的brush用完以后用 DeleteObject删除就可以了
Ryan76 2003-12-09
  • 打赏
  • 举报
回复
//FillRect(hdc,&rect,(HBRUSH)CreateSolidBrush(MyBkColor));
这里我注释的就是产生泄漏的地方


void CClient::DisplayNewsMessage(HWND hwnd)
{
COLORREF MyBkColor,MyTextColor;
HBITMAP hbmp;
CString LeftTempString,RightTempString;
static UINT OldNewsPoint = -2;
static UINT showPicture = 0;
static UINT NowPictureIndex = 0;

CSingleLock sLock(&m_mutex); //add by zgc 20030926
// 显示图片


sLock.Lock();
//m_Semaphore.Lock(); //add by zgc 20030925
if ((++ showPicture == 5) | (OldNewsPoint != NowNewsPoint))
{
OldNewsPoint=NowNewsPoint;
if (NowPictureIndex==0)
{
//切换图片
if (MessageReceived>0)
hbmp=DispInfo[(NewsQueue[NowNewsPoint]).NewsType].hbitmap0;
else
hbmp=DispInfo[MaxNewsType].hbitmap0;
NowPictureIndex=1;
}
else
{
if (MessageReceived>0)
hbmp=DispInfo[(NewsQueue[NowNewsPoint]).NewsType].hbitmap1;
else
hbmp=DispInfo[MaxNewsType].hbitmap1;
NowPictureIndex=0;
}
SendMessage(GetDlgItem(hwnd,IDC_PICTURE),
STM_SETIMAGE,
IMAGE_BITMAP,
(LPARAM) hbmp);

showPicture = 0;
}
//m_Semaphore.Unlock(); //add by zgc 20030925
sLock.Unlock();


// 显示文字
if (BarWidthIsZero)
{
BarWidthIsZero = FALSE ;
AddRightSpaceCharacter(NowNews);
}

hdc=GetDC(hwnd);

if (MessageReceived>0)
{
sLock.Lock();
//m_Semaphore.Lock(); //add by zgc 20030925
MyBkColor=DispInfo[NewsQueue[NowNewsPoint].NewsType].BkColor;
MyTextColor=DispInfo[NewsQueue[NowNewsPoint].NewsType].TextColor;
//m_Semaphore.Unlock(); //add by zgc 20030925
sLock.Unlock();
}
else
{
MyBkColor=DispInfo[MaxNewsType].BkColor;
MyTextColor=DispInfo[MaxNewsType].TextColor;
}
SetBkColor(hdc, MyBkColor);
SetTextColor(hdc, MyTextColor);

if ((UINT)NowNews[0]>=128)
{
LeftTempString=NowNews.Left(2);
RightTempString=NowNews.Right((NowNews.GetLength())-2);
}
else
{
LeftTempString=NowNews.Left(1);
RightTempString=NowNews.Right((NowNews.GetLength())-1);
}
NowNews = RightTempString;
NowNews += LeftTempString;
int i=GetGuiResources(GetCurrentProcess(),GR_GDIOBJECTS);
//FillRect(hdc,&rect,(HBRUSH)CreateSolidBrush(MyBkColor));
DrawText(hdc,NowNews,NowNews.GetLength(),&rect,DT_LEFT|DT_TOP);

ReleaseDC(hwnd,hdc);
}
ross33123 2003-12-09
  • 打赏
  • 举报
回复
把你对话框过程的其他部分也贴出来看看
Ryan76 2003-12-09
  • 打赏
  • 举报
回复
我查了 就是GDI资源泄漏
选单项并且单击 GDI 对象检查框. 一个新的纵列GDI 对象会出现在进程视图内.如果显示在这一列的某个数字随着时间增长, 你就知道有资源泄漏了
希望有经验的给些解决办法
Ryan76 2003-12-09
  • 打赏
  • 举报
回复
我觉得 ISunwu(刀口蒙特)说得对
能再具体些么。要我提供什么诊断信息?
Ryan76 2003-12-09
  • 打赏
  • 举报
回复
试了,不行,我的Dialog是自己做的回调函数


BOOL CALLBACK InfoXnaProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
int WINAPI xWinMain(HINSTANCE hInstance)
{
HANDLE hsem ;
hsem = CreateSemaphore( NULL, 1, 1, "InfoXNA") ;
if( GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle( hsem) ; // 关掉信号变量
return FALSE ;
}



//调用主程序
pClient->g_hinst = hInstance;
DialogBox(hInstance, MAKEINTRESOURCE(IDD_InfoXNA), NULL, InfoXnaProc);
return(FALSE);
}
ISunwu 2003-12-09
  • 打赏
  • 举报
回复
应该不是上面的代码的问题。其他地方有GDI资源泄漏。
checkyvc6 2003-12-09
  • 打赏
  • 举报
回复
你这样实现响应不太及时,我看了一下你可以把上面的代码
大概的意思就是用鼠标拖动窗口的问题你只要在WM_LButtonDown里面写上SendMessage(hWnd,WM_LNCBUTTONDOWN,0,0)即可
没有你那么复杂

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧