界面花了,桌面也花了

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 ;
...全文
95 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)即可
没有你那么复杂
该数据集名为“6200印章数据集-圆椭方矩-红蓝灰”,包含6200多张印章图像,涵盖圆形、椭圆形、方形和矩形四种几何形状,并包含红色、蓝色和灰色三种颜色。其目标是服务于印章识别、印章文本识别以及印章OCR技术的研究与开发。由于形状和颜色种类丰富,该数据集有助于开发者训练出适应性更强的识别系统,以应对不同应用场景。 这些印章图像均为真实印章的高清照片,能够为印章识别算法提供充足的视觉信息。不过,该数据集不包含预标注的地面真实(GT)标签,因此开发者在使用时可能需要进行一定的数据清洗和标注,才能满足模型训练要求。尽管增加了额外工作量,但其规模和多样性仍使其成为重要的研究资源。 印章识别技术广泛应用于文档审核、版权验证、金融交易验证等领域。随着机器学习和深度学习不断发展,印章识别算法已从简单的模板匹配逐渐转向更复杂的图像处理和模式识别方法。这一进步需要大量高质量训练数据,而此类数据集正是满足这一需求的关键工具之一。 考虑到印章识别在实际应用中会遇到磨损、变形以及复杂背景等问题,该数据集在设计时也兼顾了这些现实挑战。通过提供不同形状和颜色的印章图像,它有助于研究者开发出能够应对真实世界复杂情况的算法。同时,由于缺乏GT标签,研究者在训练模型前还需解决如何高效、准确地进行图像标注的问题,这既提高了研究难度,也带来了更贴近实际应用的挑战与机会。 “6200印章数据集-圆椭方矩-红蓝灰”是一个面向印章识别技术的综合性训练数据集。它的推出对推动印章识别技术发展具有重要意义。通过有效利用该数据集,开发者可以构建更强大、更准确的印章识别系统,进一步促进相关技术的落地应用。
源码下载地址: https://pan.quark.cn/s/ae487cba003d 在计算机视觉与图像处理技术领域中,OpenCV作为一个被广泛采纳的开源框架,提供了大量的函数和工具,用于对图像进行操作和分析。本篇文章将深入阐释OpenCV在处理含有RGBA通道的图像时的应用,以及如何进行通道的分离与融合。 让我们首先掌握RGBA图像的基本构成。RGB分别象征红色(Red)、绿色(Green)以及蓝色(Blue),这三种颜色的不同强度组合能够产生多样的色彩效果。而A则代表Alpha通道,它用来指示图像的透明程度或完全不透明性。在0至255的数值区间内,0值代表完全透明,255值则表示完全不透明。当处理PNG等支持透明特性的图像格式时,RGBA模型被频繁使用。 在OpenCV软件中,我们可以借助`cv::Mat`结构体来储存和操作图像数据。对于RGBA图像,`cv::Mat`结构体的数据类型通常是`CV_8UC4`,这表明每个像素点由4个8位无符号整数(Uint8)构成,分别对应R、G、B和A四个通道。 接下来,我们将讨论如何从RGBA图像中分离各个通道。在OpenCV中,`cv::split()`函数能够实现这一功能。该函数会构建一个新的`cv::Mat`数组,数组中的每个元素都是原图像的一个独立通道。例如: ```cpp cv::Mat rgbaImage; // 加载RGBA图像 cv::imread("image.png", cv::IMREAD_UNCHANGED); // 分离通道 std::vector channels; cv::split(rgbaImage, channels); cv::Mat redChannel = ...
代码转载自:https://pan.quark.cn/s/a4b39357ea24 在信息技术领域,"后处理"一般是指在计算机辅助设计(CAD)或计算机辅助制造(CAM)系统中,将设计图纸转化为机器设备操作指令的过程。在此情形下,"佳铁雕刻机后处理.rar"是一个压缩文件,其中存放了与佳铁雕刻机相关的后处理工具或配置数据。佳铁雕刻机是一种常见的数字控制机床,主要用于精细的雕刻和加工作业,比如电脑锣、精雕机或雕铣机等设备。 雕刻机后处理包含的核心知识要点有: 1. **数字控制(NC)代码的编制**:当在CAD/CAM软件中完成工件设计后,需要将其转换为机床能够识别的数字控制指令。这一步骤即为后处理,它将三维设计转化为一系列的G代码和M代码,这些指令指导雕刻机的刀具如何移动。 2. **后处理器的个性化设置**:由于不同的雕刻机可能配备不同的控制系统和机械属性,因此需要专门设计的后处理器来适配这些特性。针对佳铁雕刻机的后处理器可能包含特定的参数调整,例如进给速率、切削深度、刀具路径优化等,以实现最佳的加工效果和效率。 3. **G代码与M代码的应用**:G代码是控制刀具运动的指令,例如G00表示快速移动,G01表示线性插补,G02和G03分别代表顺时针和逆时针的圆弧插补;M代码则是辅助操作指令,如M03代表主轴正转,M05代表主轴停转。这些指令的组合构成了完整的加工程序。 4. **机床参数设定**:后处理流程会考虑到机床的具体参数,包括电机类型、丝杠螺距、工作台尺寸等,以确保生成的NC代码与实际设备相符。 5. **刀具路径的优化**:高效的后处理能够改进刀具的运动轨迹,减少无效运行时间,提升生产效率,同时避免刀具与工件的碰撞以及工件形变,确保加工的精确度。...

15,976

社区成员

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

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