視窗子類化:是建立乙個新的視窗函式代替原來的視窗函式。
簡單說來,子類化是靠攔截windows系統中的某些訊息來自己進行處理。
自己實現的是子類化乙個編輯框,對編輯框輸入的內容進行限制 只允許0~9、空格、乙個點
定義乙個ceditdemo標頭檔案
/*
邏輯順序:
1、在視窗的初始化函式中得到想要子類化的視窗控制代碼
2、attach函式中利用setwindowlong替換自己要的視窗函式,並且再定義乙個指標來儲存setwindowlong返回來的初始的視窗函式
3、定義自己想要的視窗函式newproc,先判斷umsg是否wm_char,為想要子類化的訊息事件,再利用傳過來的wparam和lparam來進行詳細的字元判斷,在進行操作
4、在視窗函式中進行處理完,還需要重新呼叫初始的視窗函式,其他的預設操作還需要交給初始的視窗函式進行處理
5、最後還需要重寫恢復視窗函式
*/#pragma once
class ceditdemo
;
ceditdemo的原始檔:
#include "stdafx.h"
#include "ceditdemo.h"
ceditdemo::ceditdemo()
ceditdemo::~ceditdemo()
bool ceditdemo::attach(hwnd hwnd)
m_hwnd = hwnd; //儲存 舊的edit控制代碼
setprop(hwnd, _t("newprop"), this);
oldproc = setwindowlong(hwnd, gwl_wndproc, (long)newproc); //替換視窗函式
if (oldproc == 0)
else
}lresult apientry ceditdemo::newproc(hwnd hwnd, uint umsg, wparam wparam, lparam lparam)
bool ret = false;
wchar_t szbuffer[16];
if (umsg == wm_char)
break;
default:
if ((wparam < '0' || wparam > '9') && wparam != vk_back)
break;
} if (ret)
} return callwindowproc((wndproc)thedemo->oldproc, hwnd, umsg, wparam, lparam);
}bool ceditdemo::detach(hwnd hwnd)
if (setwindowlong(hwnd, gwl_wndproc,(long)oldproc))
else
}
MFC 控制項子類化
程式中用到windows通用控制項。比如按鈕控制項,進度條控制項等等。但是有時我們需要給控制項更多的特色,這就需要做控制項的子類化 subclassing 子類化,通俗來講就是用自己的視窗處理函式來處理特定訊息,並將自己其他訊息還給標準 預設 視窗處理函式。在sdk中,通過setwindowlong...
視窗的子類化與超類化
1.子類化 改變乙個已經存在的視窗例項的性質 訊息處理與其他例項屬性。在sdk程式設計範疇內,子類化就是改變乙個視窗例項的視窗函式 通過getwindowlong 和setwindowlong 子類化所要做的就是為某視窗例項編寫新的視窗函式。其操作是在例項級別上進行的。在mfc中子類化的情況有所不同...
視窗的子類化與超類化
視窗的子類化與超類化 1.子類化 改變乙個已經存在的視窗例項的性質 訊息處理與其他例項屬性。在sdk程式設計範疇內,子類化就是改變乙個視窗例項的視窗函式 通過getwindowlong 和setwindowlong 子類化所要做的就是為某視窗例項編寫新的視窗函式。其操作是在例項級別上進行的。在mfc...