动态创建窗口,并重写窗口过程

在窗口过程中处理滚动条消息

WNDPROC pSubclassOldEditProc;
INT iVScrollPos = 0, iVTextPos = 0;

LRESULT winProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	//获取新设置的窗口属性,就是获取CNewEdit的指针,方便后面访问m_lOldProc这个成员
	if (message == WM_VSCROLL)
	{
		//TRACE( _T("%d\n"), LOWORD(wParam));
		switch (LOWORD(wParam))
		{
			case SB_LINEDOWN:
				if (iVScrollPos != (NUMLINE - 1)) 
					iVTextPos -= 1;
				TRACE(_T("向下滚动一行\n") );
				break;
			case SB_LINEUP:
				if (iVScrollPos != 0) iVTextPos += 1;
				TRACE( _T("向上滚动一行\n"));
				break;
			case SB_PAGEUP:
				TRACE( _T("向上滚动一页\n"));
				break;
			case SB_PAGEDOWN:
				TRACE( _T("向下滚动一页\n"));
				break;
			case SB_THUMBPOSITION:
				CScale3DCListBox::AdjustListBox(iVScrollPos);
				break;
			case SB_THUMBTRACK:
				iVTextPos = -HIWORD(wParam);

				break;
			default:
				break;
		}

		iVScrollPos = -iVTextPos;
		SetScrollPos(hwnd, SB_VERT, iVScrollPos, TRUE);
	}
	//处理完需要截获(改变)的消息后接着返回旧的窗口过程
	return CallWindowProc((WNDPROC)pSubclassOldEditProc, hwnd, 
	       message, wParam, lParam);
}

创建窗口并替换过程函数,如下

m_pWndListBoxDlg = new CWnd;
LPCTSTR lpszClassName = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW,
		AfxGetApp()->LoadStandardCursor(IDC_ARROW),
		(HBRUSH)GetStockObject(LTGRAY_BRUSH), NULL);
m_pWndListBoxDlg->Create(lpszClassName, _T(""), WS_CHILD | WS_VISIBLE| 
                WS_VSCROLL| ES_AUTOHSCROLL,
		rt1, parentWnd, 5234);

m_uID     = 5234;
m_nHeight = nHeight;

//设置滚动条
m_hwndListbox = m_pWndListBoxDlg->GetSafeHwnd();
m_pWndListBoxDlg->SetScrollRange(SB_VERT, 0, NUMLINE - 1, FALSE);
//设置 TRUE 滚动条立即重绘 这样才能看到新位置  
m_pWndListBoxDlg->SetScrollPos(SB_VERT, 0, TRUE);
//更换窗口过程
pSubclassOldEditProc = (WNDPROC)::SetWindowLong(
      m_pWndListBoxDlg->GetSafeHwnd(), 
      GWL_WNDPROC,(DWORD)winProc);

原文地址:http://blog.51cto.com/9233403/2132848

时间: 2024-10-10 16:48:06

动态创建窗口,并重写窗口过程的相关文章

如何在SOUI窗口中动态创建新的SWindow?

一些网友经常出现的一个问题就是我下面的代码为什么在SOUI的xxx窗口中没有动态创建了新窗口: SWindow *pWnd = new SWindow(); FindChildByName(L"xxx")->InsertChild(pWnd); 上面这样的代码有3个问题: 1.它并不会在界面中显示出来你new出来的子窗口.因为这个新插入的窗口没有指定布局属性. 2.这样做在程序退出时可能出现崩溃,因为内存分配和翻译可能不在相同的模块. 3.pWnd中的各种其它属性也没有被正常初始

unity3d UGUI动态创建窗口获取窗口大小的问题

    private IEnumerator RefreshProcess(Vector2 worldPosition)     {         this.Renders();         yield return null;         yield return null;         mRootWidth = (mRoot as RectTransform).rect.width;         mrootHeigh = (mRoot as RectTransform).

win32中窗口程序的运行过程

win32应用程序只是创建窗口,并不具体的来处理所发的窗口消息,窗口消息由windows调用函数来处理,如WM_CREAT等都是windows里的消息,回调函数通过这些消息来处理窗口过程. 如下图,creatwindow等函数都会向windows发送消息,具体消息怎么处理由windows调用用户函数进行,windows就像一个中间商一样

创建类似于输入法窗口的非激活窗口

原文:创建类似于输入法窗口的非激活窗口 创建类似于输入法窗口的非激活窗口 周银辉 我们注意到输入法的候选词窗口是不会被激活而获得输入焦点的, 一个很明显的现象是当你用鼠标点击该窗口时, 系统焦点不会转移到该窗口上, 原来获得焦点的窗口不会失去焦点. 这很棒, 如何实现呢? 很简单, 只要将窗口的ExStyle设置为WS_EX_NOACTIVATE(0x8000000)即可. (另外, 值得注意的是, 如果窗口在任务栏显示图标的话, 仍可以通过任务栏图标来激活它) 方式1, winform窗口中,

Win32 程序开发:创建一个应用程序窗口

一.创建一个应用程序窗口 代码如下: // 头文件 #include <windows.h> // 全局变量 WCHAR g_lpszClassName[] = L"CLASSNAME"; WCHAR g_lpszWindowName[] = L"哈喽,新的征程"; // 函数声明 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); // 应用程序主函数 INT APIENTRY WinMain(H

STM32F0xx_看门狗(独立+窗口)配置详细过程

Ⅰ.概述 对于看门狗,我觉得做单片机或者嵌入式开发的人员来说并不陌生,今天总结STM32F0看门狗的功能,F0的看门狗有两种:独立和窗口看门狗. 今天提供两种看门狗的软件工程实例,供大家下载. 两种看门狗各有各的特点,应用在不同的场合,下面将分别简单总结一下独立和窗口看门狗的功能. 本着免费分享的原则,方便大家手机学习知识,每天在微信分享技术知识.如果你觉得分享的内容对你有用,又想了解更多相关的文章,请用微信搜索“EmbeddDeveloper” 或者扫描下面二维码.关注,将有更多精彩内容等着你

创建一个简单的窗口(eclipse c++)

玩了几天的C++,突然发现一个问题,为啥我借的这本书C++教程800多页,但是到结束都没有介绍一点窗口的代码呢?哪怕可以创建一个提示窗口呢? 我比较愚笨,想在网上找个在WINDOWS的窗口的程序,但是把代码复制进去,都不能用.一看都是VC的,可是当时配置的环境就用的是eclipse+CDT+MinGW.一看到函数入口都是int WINAPI WinMain 而不是main的时候,就慌了.什么情况. 为此翻了一下午网站,都说的不详不细的(时间都足够装几遍VC的了),按道理说像我这样环境的人应该很多

Android开发系列(二十六):使用PopupWindow创建对话框风格的窗口

创建对话框风格的窗口很简单,需要步骤: 1.调用PopupWindow的构造器创建PopupWindow对象 2.调用PopupWindow的showAsDropDown(View v)作为v组件的下拉组件显示出来:或调用PopupWindow的showAtLocation()方法将PopupWindow在指定位置显示出来. 首先,我们创建一个Android项目,然后编辑main.xml文件: <?xml version="1.0" encoding="utf-8&qu

深入delphi编程理解之消息(一)WINDOWS原生窗口编写及消息处理过程

通过以sdk方式编制windows窗口程序,对理解windows消息驱动机制和delphi消息编程有很大的帮助. sdk编制windows窗口程序的步骤: 1.对TWndClass对象进行赋值; 2.向系统注册wndclass对象(RegisterClass): 3.CreateWindow创建窗口,获得窗口句柄Hwnd; 4.显示窗口(ShowWindow): 5.通过GetMessage函数不断获取系统消息,交给程序处理,程序过通回调函数(wndproc)处理系统消息.(消息处理部分)程序代