c 視窗過程封裝的一些實現

2021-12-29 22:53:33 字數 1711 閱讀 6156

如何封裝視窗過程是所有ui庫最核心的設計之一,像mfc/wtl/vcl都各有自己的實現**,最終的目標卻是一樣的:將視窗過程轉化為物件的方法,從而把面向過程的windows轉化為物件導向的方式。這裡要介紹我自己想到兩種實現方式,這些實現都很簡單,但都可以達到同樣的目的。

一、利用視窗的屬性表

基本原理是將視窗控制代碼和視窗類例項繫結在一起,每個視窗都有自己的屬性表,通過getprop和setprop等api操作之,屬性表本質上就是雜湊表,通過乙個key快速查詢到value,在這裡key就是視窗控制代碼,value就是視窗類。

另外,我們需要乙個自己的標準視窗過程,用來找到與控制代碼關聯的視窗類,然後再呼叫視窗類的視窗過程。

先看看實現的**:

view plaincopy to clipboardprint?

#ifndef wndhandler_h__  

#define wndhandler_h__  

#include   

#define _window_clsatom  "wndatom"  

class wndhandler  

virtual ~wndhandler()  

bool subclass(hwnd hwnd)  

void unsubclass()  

protected:  

static lresult callback stdwndproc(hwnd hwnd, uint msg, wparam wparam,  lparam lparam)  

virtual bool wndproc(hwnd hwnd, uint msg, wparam wparam, lparam lparam, lresult& ret)  

}  

return false;  

}  

protected:  

wndproc     mdefwndproc;  

hwnd        mhwnd;  

};  

#endif // wndhandler_h__ 

#ifndef wndhandler_h__

#define wndhandler_h__

#include

#define _window_clsatom  "wndatom"

class wndhandler

virtual ~wndhandler()

bool subclass(hwnd hwnd)

void unsubclass()

protected:

static lresult callback stdwndproc(hwnd hwnd, uint msg, wparam wparam,  lparam lparam)

{wndhandler* handler = (wndhandler*)getpropa(hwnd, _window_clsatom);

_assert(handler);

lresult ret = 0;

bool done = handler->wndproc(hwnd, msg, wparam, lparam, ret);

if (done)

return ret;

else

return callwindowprocw(handler->mdefwndproc, hwnd, msg, wparam

晶元封裝的一些資訊

plcc plastic leaded chip carrier package 塑料有引線晶元載體封裝,常用的有 pc20,28,44,68和84等引腳 tqfp thin quad flatpack package 細四周扁平封裝,常見100,144,176等引腳 pqfp plastic qu...

vue封裝的一些函式

因專案要用到一些常用的函式,故簡單的封裝了些函式,方便自己以後呼叫把 utils.js 根據陣列中欄位排序,從小到大 export const compare property 根據陣列中欄位排序,從大到小 export const compare big property 獲取當前時間 格式yyy...

關於axios的一些封裝

關於axios的封裝 應用場景,專案中涉及100個ajax請求,其中 1.其中60個需要在請求頭header設定tokenheaders 用於許可權校驗 2.其中20個為上傳excel檔案需要在請求頭中設定content type headers 上面說的 1 2 3可以在全域性request攔截中...