例說 WIN SDK 視窗子類化技術

YunShell發表於2013-07-21

1.什麼是視窗子類化技術?

比喻:在學校的時候,老師在課堂給你上課,老師講解的東西(這裡就是windows的訊息),你就是視窗,專門接受老師所講授的訊息,這時候老師講什麼你最清楚,有天,你病,沒去上課,你叫同學幫比補課,老師把訊息傳給同學,同學在給你講,這時候,同學有可能漏講一些知識,也可能自己補充一切知識,然後在給你講。

第一種情況:老師給你講  (這個就是未視窗子類的時候)

第二種情況:老師給同學講,同學在給你講  (視窗子類化的時候)

也就是說: windows響應的訊息,全部由你自定義的視窗函式來處理,是忽略某些,還是保留某些都由你說了算了,然後在傳回給主視窗處理。

2.如何 實現視窗子類化

參量:你所需要的子視窗的控制程式碼(子視窗可以是控制元件,或者任意的子視窗),萬物皆控制程式碼

       LONG SetWindowLong( HWND hWnd,      int nIndex,      LONG dwNewLong );

  •       hWnd = 將要實施子類化的視窗的控制程式碼
  •      nIndex = 函式了功能索引 
                       GWL_EXSTYLE 設定視窗的擴充套件風格. 
                       GWL_STYLE 設定新的視窗風格
                       GWL_WNDPROC 設定新的視窗處理函式地址
                       GWL_HINSTANCE 設定新的應用程式控制程式碼
                       GWL_ID 設定新的視窗標識
                        GWL_USERDATA 設定一個與這個視窗相關的給使用者使用的32位的資料
  •                   dwNewLong = 用來更新的資料
  • 該函式返回以前的視窗過程的地址,要儲存下來,用來恢復的

2.一個例子說明:用視窗子類化技術 來選擇Edit控制元件輸入的字元

目的:要求編輯框不能輸入0~9的數字 。

#include "stdafx.h"
#include <windows.h>
#include <windowsx.h>
#include "resource.h"
#include "MainDlg.h"
#include<Commctrl.h>
#include  "windef.h"

WNDPROC  OldProc;
HWND hedit;
BOOL WINAPI Edit_Proc(HWND hedit, UINT uMsg, WPARAM wParam, LPARAM lParam)//視窗子類化
{	
	
	switch(uMsg)
	{
		case WM_CHAR: //響應編輯框內輸入的字元
			{	BYTE inchar=LOBYTE(wParam);
				if(inchar>='0'&& inchar<='9')
				return CallWindowProc(OldProc,hedit,uMsg,0,lParam);//0~9傳回NULL值
				break;	
			}
				break;
	}
	return CallWindowProc(OldProc,hedit,uMsg,wParam,lParam);//負責正常傳回去主視窗處理
}

BOOL WINAPI Main_Proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
	case WM_INITDIALOG:
		{	
			hedit=GetDlgItem(hwnd,IDC_EDIT);
			OldProc=(WNDPROC)SetWindowLong(hedit,GWL_WNDPROC,(LONG)Edit_Proc);//最重要的一句,這句顯示瞭如何視窗子類 注意各個引數即可
			return TRUE;
		}
	
	case WM_COMMAND:
		{
			switch(wParam)
			{
				case IDC_OK:
				{  MessageBox(hwnd,TEXT("確定了"),TEXT(""),MB_OK);
					break;
				}
			}
			break;
		}
	case WM_CLOSE:
		EndDialog(hwnd,0);
		break;
    }

    return FALSE;
}



相關文章