子对话框响应了WM_PAINT,但是始终没有执行onpaint函数,怎么回事啊请问?
IsIconic()
你是说有一个这个判断进行不同的逻辑吗?
IsIconic()分支代码的作用是当窗口处于最小化状态时进行图标的绘制操作。但是实际上你会发现,在窗口最小化一般来说是不会进行窗口的重绘,也就是不会触发WM_PAINT消息。当然,用户可以强制进行重绘。正常情况下,在RegisterClass时我们一般会为wc设置一个图标Icon。如果注册窗口类的时候为窗口类设置了图标,那么当窗口最小化的时候,系统会绘制此图标;如果注册窗口类的时候我们没有为窗口类设置图标,那么当窗口最小话Minimized的时候,系统会发一个WM_PAINT消息通知窗口过程进行窗口最小化的绘制操作。
msdn是如上所说。不过测试了下,通过修改对话框的GCL_HICON,设置为0,然后在对话框窗口最小化的时候也是不会触发OnPaint。msdn关于WM_ICONERASEBKGND消息也是在win3.1之前的版本有效,在绘制图标之前先擦除背景,在win3.1之后的版本被忽略。
实际上,在窗口最小化我们可以再wm_syscommand消息中处理最小化操作,但是此时窗口的isIconic返回的还是false,表面此时窗口的最小化状态还没有被设置。另外还有一个消息就是wm_size,在最小化窗口后会发生wm_size消息,在发此消息之前窗口的最小化状态是已经被设置了的。因此如果想要在窗口最小化做什么操作的话,可以再wm_size中处理,然后用IsIcnoic函数判断是否是最小化。
OnPaint其实是响应WM_PAINT消息,该消息属于系统消息,任何窗口都可以接受
但是如果在写文档程序(单文档/多文档),该倾向于使用OnDraw
想了解更多,建议多看MSDN
背景位图,这些问题,google下,也是处理消息。
(WM_CTLCOLOR WM_ERASEBKGROUND我都曾经实现过,好久不搞VC了具体你google下,现在在linux下面玩代码(-:)
学习VC必须要把英文关过了
不会的,除非你拦截了WM_PAINT消息,不然都会执行OnPain函数的。如下面这个代码段:
// Message map and handlers
BEGIN_MSG_MAP(CDoubleBufferImpl)
MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
#ifndef _WIN32_WCE
MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint)
#endif // !_WIN32_WCE
END_MSG_MAP()
LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
return 1; // no background painting needed
}
LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
T* pT = static_cast<T*>(this);
ATLASSERT(::IsWindow(pT->m_hWnd));
if(wParam != NULL)
{
RECT rect = { 0 };
pT->GetClientRect(&rect);
CMemoryDC dcMem((HDC)wParam, rect);
pT->DoPaint(dcMem.m_hDC);
}
else
{
CPaintDC dc(pT->m_hWnd);
CMemoryDC dcMem(dc.m_hDC, dc.m_ps.rcPaint);
pT->DoPaint(dcMem.m_hDC);
}
return 0;
}
VC2005 MFC 限时对话框
右键类视图中的窗体类,添加Windows消息响应函数,响应的消息是WM_TIMER,这样就会多一个OnTimer函数出来,传入的参数是你启动定时器时候的定时器编号。然后再OnInitDialog()函数中调用SetTimer(UINT id, UINT 间隔毫秒,NULL 一般不用这个参数),启动定时器,定时的间隔就是你需要的时间,记住1000毫秒=1秒...
MFC的InitInstance和OnInitDialog
InitInstance()是初始化实例,是winthread的线程初始化函数,完成winapp线程初始化。OnInitDialog()是初始化对话框,响应wm_initdialog消息。
如何在对话框程序中让对话框捕获WM_KEYDOWN消息
用windows的钩子函数 钩子函数的安装:SetWindowsHookEx 钩子函数的卸载:UnhookWindowsHookEx 在收到消息为WM_KEYUP 或WM_KEYDOWN时触发键盘钩子:LRESULT CALLBACK KeyboardProc (int code, \/\/ hook code WPARAM wParam, \/\/ virtual-key code LPARAM lParam \/\/ keystroke-message information );
在MFC 中按钮怎样响应 WM_MOUSEMOVE ??\/.
在insert菜单里面选择 add new class 然后在对话框里面输入你的类名,在基类里面选择CButtom 响应WM_MOUSEMOVE 你可以在class wizard里面添加
拖动滚动条会引起重绘吗?也就是会响应WM_PAINT消息吗
WM_PAINT是对话框的重绘消息,好像在这几种情况下会触发:1)程序启动时 2)程序窗口被其他窗口覆盖,然后又再次出现时(不确定)3)程序窗口有一部分被移出到桌面之外时 所以拖动滚动条应该不会触发WM_PAINT消息
BOOL CMainDlg::OnInitDialog() 什么意思
主对话框的成员函数OnInitDialog(), 在对话框初始化的时候被调用,响应WM_INITDIALOG消息,用于完成除基本的创建之外的额外的初始化工作。将额外的初始化代码在这个函数中实现。
模式对话框和非模式对话框的区别
3、销毁的区别模式对话框的销毁是使用EndDialog,而非模式对话框的销毁是使用DestroyWindow。所以在销毁对话框的时候,也要对其进行区别。非模式对话框,用户关闭对话框时,对话框消息处理函数将收到WM_CLOSE消息,接到后调用DestroyWindow以销毁非模式对话框。模式对话框,则一般响应IDOK和IDCANCEL。在PPC上,...
在MFC中如何为滚动条添加消息事件处理程序:onvscroll
滚动条控件的滚动事件是由其父对话框来响应的 所以,直接响应对话框的WM_VSCROLL和WM_HSCROLL消息就可以了 若对话框中有多个滚动条,则可以用WM_VSCROLL和WM_HSCROLL消息响应函数中的参数CScrollBar pScrollBar来进行判断
MFC中, WM_PAINT和WM_DRAW消息有啥区别?
MFC没有WM_DRAW消息,重绘消息就是WM_PAINT。OnPaint是对WM_PAINT的响应,在标准窗口、对话框等派生窗口中使用。OnDraw是特殊的、只使用于CView类的重绘方法,实际上是View类封装了WM_PAINT消息,目的是为了实现视图类标准重绘准备和打印一体化支持。View类的WM_PAINT消息,实际流程大概是这个样子:void ...
在MFC中,响应WM_CLOS消息的函数里,怎么访问不了列表框控件???
访问不了指的是什么意思?TCHAR SetFilePath[MAX_PATH+10];wsprintf(SetFilePath,"%s\\\\setting.ini",exePath);这是错误的,应该改为:_tcscpy(SetFilePath,exePath);_stprintf(_tcsrchr(SetFilePath,TEXT('\\\\')),TEXT("\\\\setting.ini"));你的做法SetFilePath会变成C:\\1.exe\\settings.ini 修...
窄杨妇科: 不会的,除非你拦截了WM_PAINT消息,不然都会执行OnPain函数的.如下面这个代码段:// Message map and handlersBEGIN_MSG_MAP(CDoubleBufferImpl)MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground)...
泰和县18485668253: 基于对话框的MFC中子对话框为何不显示载入的背景图片 - ?
窄杨妇科: 你的WM_ERASEBKGND有没有让其不进行任何处理?WM_PAINT和WM_ERASEBKGND不能同时共存的,不然会遮盖你的绘图.另外你Debug一下,看你的子对话框的OnPaint函数执行成功了没?
泰和县18485668253: 拖动CFormView,导致CFormView内控件重绘,怎么办 - ?
窄杨妇科: CDialog::OnPaint() 在这个消息响应函数里面画图 因为拖动对话框导致界面重绘,响应WM_PAINT事件,执行该函数里面的代码.
泰和县18485668253: 【VC++】对话框中OnPaint中,最后的OnPaint是干什么的 - ?
窄杨妇科: CDialog::OnPaint()是给对话框一个描画的机会(WM_PAINT事件的响应).如果没有特殊的描画任务,就不必改写OnPaint().CDialog::OnPaint()将调用CWnd的OnPaint(),CWnd的OnPaint()接着调用 LRESULT CWnd::DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam) 到了这个函数就意味着,用户对一个事件没有作处理,而是交给系统处理.粗略地说就是这些了.为什么我注销掉这句后,对话框表面描画有问题?是因为WM_PAINT事件没有得到妥善处理.
泰和县18485668253: 我编的程序,按下鼠标左键弹出messagebox.但现在弹不出来,按一下Alt键才能看到弹出的messagebox - ?
窄杨妇科: 这分我要了啊,在你的WM_PAINT消息响应中,加入以下两条代码:BeginPaint(hWnd,NULL); EndPaint(hWnd,NULL); 就可以了,合起来就是如下: case WM_PAINT: BeginPaint(hWnd,NULL); EndPaint(hWnd,NULL); return 0; 快加分吧,你那个帖子我就不回复了 VC6.0下面也可以编译,我刚刚试了下,你必须把光标的类型改一下,你用的那个HAND型在VC6.0中不能支持,然后把相关的L宏定义都去掉,应该就差不多了,这两者只要会一个就行了,不用都会
泰和县18485668253: c++ WM - PAINT - ?
窄杨妇科: 第一种情况显示出来的字很正常.case WM_PAINT:gdc = BeginPaint (hwnd, &ps);TextOut (gdc, 0, 0, s, strlen (s));break;第二种情况显示 的字不停闪烁.case WM_PAINT:gdc = GetDC (hwnd); TextOut (gdc, 0, 0, s, strlen (s));ReleaseDC ...
泰和县18485668253: 关于win32 sdk 窗口重画的问题 - ?
窄杨妇科: 你理解错了msdn的话了,WM_PAINT会发送的条件不是“客户去不为空”,而是失效区域不为空!这个区域就是你标记的或者是Winodws标记为失效的区域,失效的意思是这个区域内的内容已经不正确了,取消重新绘制.你如何设置失效区域...
泰和县18485668253: “分析对话框和文档/视图结构运行机制及心得体会.”这是我们作业,回答的越多越好 - ?
窄杨妇科: 在MFC中,CView及其派生类将显示及其相关的操作做的很好,比如在程序中 如果我们的视图类继承CScrollView了那么我们不用写任何代码该视图就能够 具有滚动的响应机制,能够自动根据设置的滚动范围和窗口实际大小确定是 否显示滚动...
泰和县18485668253: 拖动滚动条会引起重绘吗?也就是会响应WM - PAINT消息吗 - ?
窄杨妇科: WM_PAINT是对话框的重绘消息,好像在这几种情况下会触发: 1)程序启动时 2)程序窗口被其他窗口覆盖,然后又再次出现时(不确定) 3)程序窗口有一部分被移出到桌面之外时所以拖动滚动条应该不会触发WM_PAINT消息
泰和县18485668253: WM - PAINT消息ValidateRect - ?
窄杨妇科: 每个窗口(HWND)实例,在windows操作系统中,都有个上下文记录区,其中记录着当前窗口的无效区域数据.系统内核利用空闲时间检查所有窗口的无效区,如果非空,就产生一个WM_PAINT发送给此线程再转发到当前窗口来处理.当然此...