學習 MFC子類化

2022-03-13 22:48:14 字數 1454 閱讀 7890

視窗子類化:是建立乙個新的視窗函式代替原來的視窗函式。

簡單說來,子類化是靠攔截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...