关于Win32窗口程序中 窗口类的WinProc自定义方法

最近脑抽,用win32 API写了一个数据处理平台,将各个窗口定义为Class进行自管理,但是由于类常规成员函数不能作为窗口函数,只能将窗口函数定义为静态函数,这样写则后续在窗口函数中引用的函数都要定义为静态函数,且不能引用类中的成员变量,非常麻烦,通过调研(竟然在20年前的贴子中找到了一个方法,但只是思路,无法直接使用)可以在createstruct中将成员函数传递给窗口,实现如下,包含一个窗口及对话框。

//GLOBALWINPROC.H
#pragma once
//这是全局窗口函数,及窗口基类
#include "stdafx.h"
#ifndef GLOBAL_WIN_PROC_H
#define GLOBAL_WIN_PROC_H

//基类
class CLASSWINPROC {
public:
	virtual LRESULT WINAPI WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) = 0;
	~CLASSWINPROC() {};
};

//窗口函数
LRESULT WINAPI GlobalWinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
//对话框函数
LRESULT WINAPI GlobalDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
#endif // !GLOBAL_WIN_PROC_H
#pragma once
#include "stdafx.h"

LRESULT WINAPI GlobalWinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
	CLASSWINPROC *pclass = NULL;
        //在第一个消息到来时,设置userdata,使在后续消息中能调用自定义窗口函数
        //第一个消息为WM_NCCREATE,这里也把wm_crete写上,更好理解一些
	if (message == WM_CREATE|| message == WM_NCCREATE) {
		CREATESTRUCT** cs = (CREATESTRUCT **)lParam;
		pclass = (CLASSWINPROC*)((*cs)->lpCreateParams);
		SetWindowLongPtr(hWnd, GWLP_USERDATA, reinterpret_cast<LONG_PTR>(pclass));
		return pclass->WinProc(hWnd, message, wParam, lParam);
	}
	if (message == WM_DESTROY|| message == WM_CLOSE) {//当收到关闭窗口消息时,将窗口函数设置为默认窗口函数
                LONG_PTR user_data = GetWindowLongPtr(hWnd, GWLP_USERDATA);
                delete reinterpret_cast<CLASSWINPROC *>(user_data);//删除在构造函数的创建的对象
		SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)DefWindowProc);
		return DefWindowProc(hWnd, message, wParam, lParam);
	}
	else {//下面的消息均调用自定义窗口函数
		LONG_PTR user_data = GetWindowLongPtr(hWnd, GWLP_USERDATA);
		pclass = reinterpret_cast<CLASSWINPROC *>(user_data);
		return pclass->WinProc(hWnd, message, wParam, lParam);
	}
	//return 0;
}
LRESULT WINAPI GlobalDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
	CLASSWINPROC *pclass ;
	if (message == WM_INITDIALOG) {
	    //对话框的第一个消息并不是WM_INITDIALO,只有在此消息到来时才设置userdata
		pclass = (CLASSWINPROC*)(lParam);
		SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)(pclass));
		return pclass->WinProc(hWnd, message, wParam, lParam);
		
	}
	LONG_PTR user_data = GetWindowLongPtr(hWnd, GWLP_USERDATA);
	if(user_data!=NULL)//未设置userdata时,返回的值为NULL
		return ((CLASSWINPROC*)user_data)->WinProc(hWnd, message, wParam, lParam);
	return 0;
}
class SEISMICVIEW:CLASSWINPROC  {
public:
	SEISMICVIEW(){};
	SEISMICVIEW(HWND hwnd, HINSTANCE hinst, const RECT rct, TCHAR* szWindowClass) :hParentWnd(hwnd), hInst(hinst){
                //
		SEISMICVIEW *sv = new SEISMICVIEW(*this);//这个对象一直保留直到窗口关闭
		CREATESTRUCT cs;
		cs.lpCreateParams = sv;
		seismicview = CreateWindow(szWindowClass, _T("childwindow"), WS_CHILD | WS_VISIBLE | WS_CAPTION,
			0, 0, rct.right, rct.bottom, hParentWnd, nullptr, hInst, &cs);
		sv->seismicview = seismicview;
		int n = GetLastError();
		if (seismicview == NULL) {
			delete sv;
		}
	}
	
	~SEISMICVIEW() { };
public:


	HWND seismicview ;//
	HWND hParentWnd;
	HINSTANCE hInst;
	//message handle
	LRESULT WINAPI WinProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);	

};
class TRACEHEADVIEW:CLASSWINPROC {
public:
	TRACEHEADVIEW(HWND hWnd, HINSTANCE hInst, SEISMICPLOT* sp) : hParentWnd(hWnd), hInst(hInst), sp(sp) {

		DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_DIALOGTRACEHEAD),hParentWnd, (DLGPROC)GlobalDlgProc,(LPARAM)this);
	}

	LRESULT WINAPI  WinProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);

public:
	HWND hParentWnd;
	HINSTANCE hInst;
	HWND hWnddlg;
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
03-16
WinProc是一个在Windows下通用的进程管理工具,它除了具有一般进程管理工具的所有功能,还有一些自己的特色。下面是功能简介: 进程信息查看:可以查看进程的详细信息,包括线程数、模块数、占用内存、文件路径及进程相关的进程、线程详细信息等。 进程优先级设置:你可以主观上控制进程的CPU占用时间。 杀进程:WinProc提供多种杀进程方式。 1.在进程列表中直接双击可以结束选定进程; 2.在进程列表中右击选定进程,在弹出菜单中选择“结束该进程之后所有进程”可以用来对付令人讨厌的一直跑出来的IE窗口; 3.将一个或者多个进程加入待结束进程列表,可是对多个进程同时进行操作,比如全部结束或者定时结束; 4.另外右击系统通知区的WinProc小图标,在弹出菜单的杀进程子菜单中选择所要结束的进程,可以快速结束进程,全都是鼠标操作。 定时操作:在WinProc中可以定时结束进程或者定时关机。 保存进程列表:以文本方式保存当前系统运行的进程列表,以备查看,比较平庸的一个功能。 进程黑名单:顾名思义,将进程加入进程黑名单后,该进程将无法被启动。至于这样做的意义何在,就看什么人怎么用了,呵呵。 锁定屏幕:当你离开电脑的时候可以将屏幕锁定,没有你的密码将无法解锁,但是别人可以在你的屏幕上给你留言,用用就知道了。 热键激活WinProc:可以按热键(F12)激活或者隐藏WinProc,而且需要说明的是该热键穿透力很强,你甚至可以在一些屏蔽了热键的程序中激活WinProc。 热键杀进程:这个功能是为了应急而设计的。比如你在上班时间打游戏的时候,老板突然出现...如果你事先把一些比较敏感的程序(这里是游戏)加入待结束进程列表的话,不要急,只要按一下ScrLock,那尴尬的一幕将不复出现。 快速重启、注销、关机:如果你什么都喜欢快的话,这个功能或许能帮上忙。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值