TA的每日心情 | 开心 2022-1-9 18:18 |
---|
|
标准系统控件闪烁主要原因,是因为每次重绘时需要绘制两次,第一次擦出背景绘制,第二次绘制内容,两次绘制颜色不一样,导致用户看见控件闪烁!
解决办法就是拦截系统控件背景擦出消息WM_ERASEBKGND,不让它擦出背景,这样就不会闪烁!
IE控件比较特殊,所以处理起来也比较麻烦,下面是对IE控件的特殊处理.
- LONG prevProc1=NULL;
- HHOOK hHook=NULL;
- LRESULT CALLBACK MyWndProc1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
- {
- if(WM_ERASEBKGND==message) //拦截背景擦出消息
- return 0;
- return CallWindowProc((WNDPROC)prevProc1,hWnd, message, wParam, lParam);
- }
- //对IE控件子类化
- LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam)
- {
- if(HC_ACTION==nCode)
- {
- PCWPSTRUCT pInfo=(PCWPSTRUCT)lParam;
- if(WM_CREATE==pInfo->message)
- {
- char className[101]={0};
- GetClassNameA(pInfo->hwnd,className,100);
- if(0==strcmp(className,"Internet Explorer_Server"))
- {
- prevProc1=GetWindowLong(pInfo->hwnd,GWL_WNDPROC);
- SetWindowLong(pInfo->hwnd,GWL_WNDPROC,(LONG)MyWndProc1);
- }
- }
- }
- return CallNextHookEx(hHook,nCode,wParam,lParam);
- }
- int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
- {
- XInitXCGUI(); //初始化界面库
- //.... 您的代码
- hHook=SetWindowsHookEx(WH_CALLWNDPROC,CallWndProc,NULL,GetCurrentThreadId()); //安装钩子
- XRunXCGUI(); //运行
- UnhookWindowsHookEx(hHook); //卸载钩子
- }
复制代码
|
|