日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

【转】走进windows编程的世界-----对话框、文本框、按钮

發布時間:2023/12/10 windows 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】走进windows编程的世界-----对话框、文本框、按钮 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、對話框

1 對話框的分類
2 對話框的基本使用方式
3 對話框資源
4 有模式對話框的使用

int DialogBox(
?HINSTANCE hInstance,
?LPCTSTR lpTemplate,
?HWND hWndParent,
?DLGPROC lpDialogFunc
);

5 無模式對話框的使用
????5.1 添加對話框資源
????5.2 定義窗口處理函數

?BOOL CALLBACK DialogProc(
? HWND hwndDlg, ?// handle to dialog box
? ? UINT uMsg, ? ? // message
? ? WPARAM wParam, // first message parameter
? ? LPARAM lParam ? ? ); // second message parameter

????5.3 創建對話框


?HWND CreateDialog(
? HINSTANCE hInstance,//應用程序實例句柄
? LPCTSTR lpTemplate,//對話框的資源ID
? HWND hWndParent,//父窗口
? DLGPROC lpDialogFunc );//對話框的窗口處理函數

?????返回值是創建好的對話框的窗口句柄。
????5.4 顯示對話框
???????ShowWindow
????5.5 關閉對話框
???????EndDialog
????5.6 與有模式對話框對比
???????創建函數: 有模式對話框 DialogBox
?????????????????無模式對話框 CreateDialog
???????程序執行方式:?
????????有模式對話框會阻塞,禁止其他窗口的輸入
????????無模式對話框會讓主程序,不影響其它窗口的輸入

??6 對話框中的消息????????
??
????WM_INITDIALOG消息,用途類似于WM_CREATE消息
????可以在對話框創建完成后,進行數據初始化.
????它與WM_CREATE不同之處是,WM_INITDIALOG消息
????會在對話框資源模板上的所有子控件(按鈕等)
????創建完成后,再發送給對話框窗口.?
??????wParam - 當前接受輸入焦點子控件窗口句柄
??????lParam - 創建時附帶的參數

??7 對話框和普通窗口的對比
????7.1 創建方式?
??????普通窗口: CreateWindow/Ex
??????對話框: DialogBox/CreateDialog
????7.2 消息
??????普通窗口: 會收到WM_CREATE
??????對話框:???WM_INITDIALOG
????7.3 關閉方式:
??????普通窗口: DestoryWindow等
??????對話框: EndDialog

// windialog.cpp : 定義應用程序的入口點。
//
?
#include "stdafx.h"
#include "windialog.h"
?
#define MAX_LOADSTRING 100
?
// 全局變量:
HINSTANCE hInst;?? ??? ??? ??? ??? ??? ??? ??? ?// 當前實例
TCHAR szTitle[MAX_LOADSTRING];?? ??? ??? ??? ??? ?// 標題欄文本
TCHAR szWindowClass[MAX_LOADSTRING];?? ??? ??? ?// 主窗口類名
?
// 此代碼模塊中包含的函數的前向聲明:
ATOM?? ??? ??? ??? ?MyRegisterClass(HINSTANCE hInstance);
BOOL?? ??? ??? ??? ?InitInstance(HINSTANCE, int);
LRESULT CALLBACK?? ?WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK?? ?About(HWND, UINT, WPARAM, LPARAM);
?
int APIENTRY _tWinMain(HINSTANCE hInstance,
? ? ? ? ? ? ? ? ? ? ?HINSTANCE hPrevInstance,
? ? ? ? ? ? ? ? ? ? ?LPTSTR ? ?lpCmdLine,
? ? ? ? ? ? ? ? ? ? ?int ? ? ? nCmdShow)
{
?? ?UNREFERENCED_PARAMETER(hPrevInstance);
?? ?UNREFERENCED_PARAMETER(lpCmdLine);
?
??? ?// TODO: 在此放置代碼。
?? ?MSG msg;
?? ?HACCEL hAccelTable;
?
?? ?// 初始化全局字符串
?? ?LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
?? ?LoadString(hInstance, IDC_WINDIALOG, szWindowClass, MAX_LOADSTRING);
?? ?MyRegisterClass(hInstance);
?
?? ?// 執行應用程序初始化:
?? ?if (!InitInstance (hInstance, nCmdShow))
?? ?{
?? ??? ?return FALSE;
?? ?}
?
?? ?hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDIALOG));
?
?? ?// 主消息循環:
?? ?while (GetMessage(&msg, NULL, 0, 0))
?? ?{
?? ??? ?if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
?? ??? ?{
?? ??? ??? ?TranslateMessage(&msg);
?? ??? ??? ?DispatchMessage(&msg);
?? ??? ?}
?? ?}
?
?? ?return (int) msg.wParam;
}
?
?
?
//
// ?函數: MyRegisterClass()
//
// ?目的: 注冊窗口類。
//
// ?注釋:
//
// ? ?僅當希望
// ? ?此代碼與添加到 Windows 95 中的“RegisterClassEx”
// ? ?函數之前的 Win32 系統兼容時,才需要此函數及其用法。調用此函數十分重要,
// ? ?這樣應用程序就可以獲得關聯的
// ? ?“格式正確的”小圖標。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
?? ?WNDCLASSEX wcex;
?
?? ?wcex.cbSize = sizeof(WNDCLASSEX);
?
?? ?wcex.style?? ??? ??? ?= CS_HREDRAW | CS_VREDRAW;
?? ?wcex.lpfnWndProc?? ?= WndProc;
?? ?wcex.cbClsExtra?? ??? ?= 0;
?? ?wcex.cbWndExtra?? ??? ?= 0;
?? ?wcex.hInstance?? ??? ?= hInstance;
?? ?wcex.hIcon?? ??? ??? ?= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINDIALOG));
?? ?wcex.hCursor?? ??? ?= LoadCursor(NULL, IDC_ARROW);
?? ?wcex.hbrBackground?? ?= (HBRUSH)(COLOR_WINDOW+1);
?? ?wcex.lpszMenuName?? ?= MAKEINTRESOURCE(IDC_WINDIALOG);
?? ?wcex.lpszClassName?? ?= szWindowClass;
?? ?wcex.hIconSm?? ??? ?= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
?
?? ?return RegisterClassEx(&wcex);
}
?
//
// ? 函數: InitInstance(HINSTANCE, int)
//
// ? 目的: 保存實例句柄并創建主窗口
//
// ? 注釋:
//
// ? ? ? ?在此函數中,我們在全局變量中保存實例句柄并
// ? ? ? ?創建和顯示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
? ?HWND hWnd;
?
? ?hInst = hInstance; // 將實例句柄存儲在全局變量中
?
? ?hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
? ? ? CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
?
? ?if (!hWnd)
? ?{
? ? ? return FALSE;
? ?}
?
? ?ShowWindow(hWnd, nCmdShow);
? ?UpdateWindow(hWnd);
?
? ?return TRUE;
}
?
BOOL CALLBACK SettingDlgProc_1(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
?
? ? switch(message){
?? ?case WM_CREATE: //不會發生
? ? ? ? MessageBox( NULL, "WM_CREATE",
? ? ? ? ? ? "WinDlg", MB_OK );
? ? ? ? break;
?
?? ?case WM_INITDIALOG:
?? ??? ??? ?/*類似于 WM_CREATE 消息,可以在對話框常見完成后,進行數據初始化
?? ??? ??? ?*不同的是:WM_INITDIALOG 會在對話框資源莫班上所有的空間創建完成后發送給對話框窗口
?? ??? ??? ?* wParam :當前接受輸入焦點子控件窗口句柄
?? ??? ??? ?* lParam :創建時附帶的參數
?? ??? ??? ?*/
? ? ? ? MessageBox( NULL, "WM_INITDIALOG","WinDlg", MB_OK );
? ? ? ? break;
?
?? ?case WM_SYSCOMMAND:
?? ??? ?switch(wParam){
?? ??? ?case SC_CLOSE:
?? ??? ??? ?EndDialog(hwndDlg,1);
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?//EndDialog(hwndDlg,0);
?? ??? ??? ?break;
?? ??? ?}
?? ??? ?break;
?? ?default:
?? ??? ?break;
?? ?}
?
?? ?//默認對話框處理函數
?? ?//return DefDlgProc(hwndDlg, message, wParam, lParam);
?? ?return 0;
}
//
// ?函數: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// ?目的: 處理主窗口的消息。
//
// ?WM_COMMAND?? ?- 處理應用程序菜單
// ?WM_PAINT?? ?- 繪制主窗口
// ?WM_DESTROY?? ?- 發送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
?? ?int wmId, wmEvent;
?? ?PAINTSTRUCT ps;
?? ?HDC hdc;
?? ?HWND hdlg;
?
?? ?switch (message)
?? ?{
?? ?case WM_CREATE: //會發生
? ? ? ? MessageBox( NULL, "WM_CREATE",
? ? ? ? ? ? "WinDlg", MB_OK );
? ? ? ? break;
?
?? ?case WM_COMMAND:
?? ??? ?wmId ? ?= LOWORD(wParam);
?? ??? ?wmEvent = HIWORD(wParam);
?? ??? ?int ret;
?? ??? ?// 分析菜單選擇:
?? ??? ?switch (wmId)
?? ??? ?{
?? ??? ?case ID_32771:
?? ??? ??? ?//有模式對話框會阻塞,禁止其他窗口的輸入?
?? ??? ??? ?ret = DialogBox(hInst,MAKEINTRESOURCE(ID_SETTING),hWnd,SettingDlgProc_1);
?
?? ??? ??? ?if(ret != 2){
?? ??? ??? ??? ?MessageBox(NULL,"取消配置","windialog",MB_OK);
?? ??? ??? ?}else{
?? ??? ??? ??? ?MessageBox(NULL,"確定配置","windialog",MB_OK);
?? ??? ??? ?}
?
?
?? ??? ??? ?break;
?? ??? ?case ID_32772:
?? ??? ??? ?//無模式對話框會讓主程序,不影響其它窗口的輸入
?? ??? ??? ?hdlg = CreateDialog(hInst,MAKEINTRESOURCE(ID_SETTING),hWnd,SettingDlgProc_1);
?
?? ??? ??? ?//顯示對話框
?? ??? ??? ?ShowWindow(hdlg,SW_SHOW);
?? ??? ??? ?break;
?? ??? ?case IDM_ABOUT:
?? ??? ??? ?DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
?? ??? ??? ?break;
?? ??? ?case IDM_EXIT:
?? ??? ??? ?DestroyWindow(hWnd);
?? ??? ??? ?break;
?? ??? ?default:
?? ??? ??? ?return DefWindowProc(hWnd, message, wParam, lParam);
?? ??? ?}
?? ??? ?break;
?? ?case WM_PAINT:
?? ??? ?hdc = BeginPaint(hWnd, &ps);
?? ??? ?// TODO: 在此添加任意繪圖代碼...
?? ??? ?EndPaint(hWnd, &ps);
?? ??? ?break;
?? ?case WM_DESTROY:
?? ??? ?PostQuitMessage(0);
?? ??? ?break;
?? ?default:
?? ??? ?return DefWindowProc(hWnd, message, wParam, lParam);
?? ?}
?? ?return 0;
}
?
// “關于”框的消息處理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
?? ?UNREFERENCED_PARAMETER(lParam);
?? ?switch (message)
?? ?{
?? ?case WM_INITDIALOG:
?? ??? ?return (INT_PTR)TRUE;
?
?? ?case WM_COMMAND:
?? ??? ?if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
?? ??? ?{
?? ??? ??? ?EndDialog(hDlg, LOWORD(wParam));
?? ??? ??? ?return (INT_PTR)TRUE;
?? ??? ?}
?? ??? ?break;
?? ?}
?? ?return (INT_PTR)FALSE;
}

一、靜態框

1 靜態框創建
????窗口類的名稱 - STATIC, 用于窗口上
????顯示文字等, 如果使用SS_ICON/SS_BITMAP
????風格可以顯示ICON和BITMAP
????
????文本靜態框 - 創建時使用SS_SIMPLE即可
????ICON靜態框 - 創建時需要使用SS_ICON, 并且將靜態框的窗口名稱設置成對應ICON的資源ID號,例如"#101".
????
??2 靜態框的命令相應
????2.1 靜態框要添加SS_NOTIFY風格
????2.2 WM_COMMAND進行處理
???????WPARAM - HIWORD 命令ID
????????????????LOWORD 靜態框的窗口ID
???????LPARAM - 靜態框的窗口句柄.??
????
??3 靜態框的消息
????調用SendMessage函數,向Static控件發送消息
????例如: STM_SETICON消息修改控件顯示圖標
??????SendMessage( hStatic, STM_SETICON,
????(WPARAM)hIcon, 0 );
??其他:
???GetDlgItem 從窗口中獲取指定ID的子控件的窗口句柄


// WinStatic.cpp : 定義應用程序的入口點。
//
?
#include "stdafx.h"
#include "WinStatic.h"
?
#define MAX_LOADSTRING 100
?
// 全局變量:
HINSTANCE hInst;?? ??? ??? ??? ??? ??? ??? ??? ?// 當前實例
TCHAR szTitle[MAX_LOADSTRING];?? ??? ??? ??? ??? ?// 標題欄文本
TCHAR szWindowClass[MAX_LOADSTRING];?? ??? ??? ?// 主窗口類名
?
// 此代碼模塊中包含的函數的前向聲明:
ATOM?? ??? ??? ??? ?MyRegisterClass(HINSTANCE hInstance);
BOOL?? ??? ??? ??? ?InitInstance(HINSTANCE, int);
LRESULT CALLBACK?? ?WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK?? ?About(HWND, UINT, WPARAM, LPARAM);
?
int APIENTRY _tWinMain(HINSTANCE hInstance,
? ? ? ? ? ? ? ? ? ? ?HINSTANCE hPrevInstance,
? ? ? ? ? ? ? ? ? ? ?LPTSTR ? ?lpCmdLine,
? ? ? ? ? ? ? ? ? ? ?int ? ? ? nCmdShow)
{
?? ?UNREFERENCED_PARAMETER(hPrevInstance);
?? ?UNREFERENCED_PARAMETER(lpCmdLine);
?
??? ?// TODO: 在此放置代碼。
?? ?MSG msg;
?? ?HACCEL hAccelTable;
?
?? ?// 初始化全局字符串
?? ?LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
?? ?LoadString(hInstance, IDC_WINSTATIC, szWindowClass, MAX_LOADSTRING);
?? ?MyRegisterClass(hInstance);
?
?? ?// 執行應用程序初始化:
?? ?if (!InitInstance (hInstance, nCmdShow))
?? ?{
?? ??? ?return FALSE;
?? ?}
?
?? ?hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINSTATIC));
?
?? ?// 主消息循環:
?? ?while (GetMessage(&msg, NULL, 0, 0))
?? ?{
?? ??? ?if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
?? ??? ?{
?? ??? ??? ?TranslateMessage(&msg);
?? ??? ??? ?DispatchMessage(&msg);
?? ??? ?}
?? ?}
?
?? ?return (int) msg.wParam;
}
?
?
?
//
// ?函數: MyRegisterClass()
//
// ?目的: 注冊窗口類。
//
// ?注釋:
//
// ? ?僅當希望
// ? ?此代碼與添加到 Windows 95 中的“RegisterClassEx”
// ? ?函數之前的 Win32 系統兼容時,才需要此函數及其用法。調用此函數十分重要,
// ? ?這樣應用程序就可以獲得關聯的
// ? ?“格式正確的”小圖標。
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
?? ?WNDCLASSEX wcex;
?
?? ?wcex.cbSize = sizeof(WNDCLASSEX);
?
?? ?wcex.style?? ??? ??? ?= CS_HREDRAW | CS_VREDRAW;
?? ?wcex.lpfnWndProc?? ?= WndProc;
?? ?wcex.cbClsExtra?? ??? ?= 0;
?? ?wcex.cbWndExtra?? ??? ?= 0;
?? ?wcex.hInstance?? ??? ?= hInstance;
?? ?wcex.hIcon?? ??? ??? ?= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINSTATIC));
?? ?wcex.hCursor?? ??? ?= LoadCursor(NULL, IDC_ARROW);
?? ?wcex.hbrBackground?? ?= (HBRUSH)(COLOR_WINDOW+1);
?? ?wcex.lpszMenuName?? ?= MAKEINTRESOURCE(IDC_WINSTATIC);
?? ?wcex.lpszClassName?? ?= szWindowClass;
?? ?wcex.hIconSm?? ??? ?= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
?
?? ?return RegisterClassEx(&wcex);
}
?
//
// ? 函數: InitInstance(HINSTANCE, int)
//
// ? 目的: 保存實例句柄并創建主窗口
//
// ? 注釋:
//
// ? ? ? ?在此函數中,我們在全局變量中保存實例句柄并
// ? ? ? ?創建和顯示主程序窗口。
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
? ?HWND hWnd;
?
? ?hInst = hInstance; // 將實例句柄存儲在全局變量中
?
? ?hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
? ? ? CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
?
? ?if (!hWnd)
? ?{
? ? ? return FALSE;
? ?}
?
? ?ShowWindow(hWnd, nCmdShow);
? ?UpdateWindow(hWnd);
?
? ?return TRUE;
}
?
void OnCreate( HWND hWnd, UINT nMsg,
? ? WPARAM wParam, LPARAM lParam )
{
? ? CreateWindow( "STATIC", "hello Static",
? ? ? ? WS_CHILD|WS_VISIBLE|SS_SUNKEN|SS_SIMPLE|SS_NOTIFY,
? ? ? ? 50, 50, 100, 100, hWnd, (HMENU)1001,
? ? ? ? hInst, NULL );
?
? ? CreateWindow( "STATIC", "#IDI_ICON2", ? ? //已經創建了一個icon圖標,ID為101
? ? ? ? WS_CHILD|WS_VISIBLE|SS_SUNKEN|SS_ICON|SS_NOTIFY,
? ? ? ? 200, 50, 100, 100, hWnd, (HMENU)1002,
? ? ? ? hInst, NULL );
}
?
void OnCommand( HWND hWnd, UINT nMsg,
? ? WPARAM wParam, LPARAM lParam )
{
? ? int nCmdID ?= HIWORD( wParam );
? ? int nCtrlID = LOWORD( wParam );
? ? switch( nCtrlID ){
?? ?case ID_32771:
?? ??? ??? ?{
?? ??? ??? ??? ?HICON hIcon = LoadIcon(hInst,MAKEINTRESOURCE(IDI_ICON1));
?? ??? ??? ??? ?//通過ID獲取多窗口的句柄
?? ??? ??? ??? ?HWND ?hStatic = GetDlgItem(hWnd,1002);
?? ??? ??? ??? ?SendMessage(hStatic,STM_SETICON,(WPARAM)hIcon,0);
?? ??? ??? ?}
? ? case 1001:
?? ??? ?{
? ? ? ? ? ? switch( nCmdID )
? ? ? ? ? ? {
? ? ? ? ? ? case STN_CLICKED:
? ? ? ? ? ? ? ? MessageBox( NULL, "Hello Static 1001",
? ? ? ? ? ? ? ? ? ? "WinStatic", MB_OK );
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? break;
? ? case 1002:
? ? ? ? {
? ? ? ? ? ? switch( nCmdID )
? ? ? ? ? ? {
? ? ? ? ? ? case STN_CLICKED:
? ? ? ? ? ? ? ? MessageBox( NULL, "Hello Static 1002",
? ? ? ? ? ? ? ? ? ? "WinStatic", MB_OK );
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? break;
?? ?case IDM_ABOUT:
?? ??? ??? ?DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
?? ??? ??? ?break;
?? ?case IDM_EXIT:
?? ??? ??? ?DestroyWindow(hWnd);
?? ??? ??? ?break;
?? ?default:
?? ??? ? DefWindowProc(hWnd, nMsg, wParam, lParam);
? ? }
}
//
// ?函數: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// ?目的: 處理主窗口的消息。
//
// ?WM_COMMAND?? ?- 處理應用程序菜單
// ?WM_PAINT?? ?- 繪制主窗口
// ?WM_DESTROY?? ?- 發送退出消息并返回
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
?? ?int wmId, wmEvent;
?? ?PAINTSTRUCT ps;
?? ?HDC hdc;
?
?? ?switch (message)
?? ?{
?? ?case WM_CREATE:
? ? ? ? OnCreate( hWnd, message, wParam, lParam );
? ? ? ? break;
? ? case WM_COMMAND:
? ? ? ? OnCommand( hWnd, message, wParam, lParam );
? ? ? ? break;
?? ?case WM_PAINT:
?? ??? ?hdc = BeginPaint(hWnd, &ps);
?? ??? ?// TODO: 在此添加任意繪圖代碼...
?? ??? ?EndPaint(hWnd, &ps);
?? ??? ?break;
?? ?case WM_DESTROY:
?? ??? ?PostQuitMessage(0);
?? ??? ?break;
?? ?default:
?? ??? ?return DefWindowProc(hWnd, message, wParam, lParam);
?? ?}
?? ?return 0;
}
?
// “關于”框的消息處理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
?? ?UNREFERENCED_PARAMETER(lParam);
?? ?switch (message)
?? ?{
?? ?case WM_INITDIALOG:
?? ??? ?return (INT_PTR)TRUE;
?
?? ?case WM_COMMAND:
?? ??? ?if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
?? ??? ?{
?? ??? ??? ?EndDialog(hDlg, LOWORD(wParam));
?? ??? ??? ?return (INT_PTR)TRUE;
?? ??? ?}
?? ??? ?break;
?? ?}
?? ?return (INT_PTR)FALSE;
}
?

三、按鈕(button)

注冊類名:button,根據style 區分不同的

???1 按鈕的分類?
?????根據創建按鈕時使用的風格:
?????1.1 下壓式按鈕 PUSH BUTTON?
????????正常下壓式按鈕 BS_PUSHBUTTON?
????????三態下壓按鈕 BS_3STATE/BS_AUTO3STATE
?????1.2 分組按鈕 Group Button
????????按鈕樣式:BS_GROUPBOX
?????1.3 多選按鈕???Check Box?
????????按鈕樣式:BS_CHECKBOX/BS_AUTOCHECKBOX
?????1.4 單選按鈕???Radio Box
????????按鈕樣式:BS_RADIOBUTTON/
?????????????????BS_AUTORADIOBUTTON
?????????????????
???2 下壓式按鈕的使用
?????2.1 創建按鈕
????????創建時使用BUTTON
?????2.2 命令消息
????????BN_CLICKED消息: 當點擊按鈕通過WM_COMMAND消息通知父窗口
?????2.3 通知消息?
????????SendMessage
????????
???3 分組按鈕
?????3.1 創建分組按鈕
?????3.2 常用于對窗口內控件劃分區域,增加界面的友好性
????????
???4 多選按鈕 CheckBox
?????4.1 創建使用 BS_CHECKBOX/BS_AUTOCHECKBOX
???????BS_AUTOCHECKBOX 選擇狀態系統自動維護
???????BS_CHECKBOX 選擇狀態需要自己維護
?????4.2 命令響應
???????BN_CLICKED 通過WM_COMMAND消息
?????4.3 通知消息
???????BM_GETCHECK 獲取當前按鈕被選擇的狀態
???????BM_SETCHECK 設置當前按鈕被選擇的狀態
??????????wParam 用于設置狀態標示
???????狀態: BST_CHECKED 或 BST_UNCHECKED
???????
???5 單選按鈕 RadioBox
?????5.1 創建使用 BS_RADIOBUTTON/BS_AUTORADIOBUTTON
???????BS_AUTORADIOBUTTON 選擇狀態系統自動維護
???????BS_RADIOBUTTON 選擇狀態需要自己維護
???????注意:
???????RadionBox分組 - 使用WS_GROUP樣式,可以將
???????RadionBox分成多個組.
??????????A CreateWindow (??,,,WS_GROUP );
??????????B CreateWindow...
??????????C CreateWindow (??,,,WS_GROUP );
??????????D CreaetWindow...
??????????A和B是一組, C和D是一組
?????5.2 命令響應
???????BN_CLICKED 通過WM_COMMAND消息
?????5.3 通知消息
???????與CheckBox類似

// WinButton.cpp : Defines the entry point for the application.
//
?
#include <Windows.h>
#include <stdio.h>
?
HINSTANCE g_hInst = NULL;
?
void OnCreate( HWND hWnd, UINT nMsg,
? ? WPARAM wParam, LPARAM lParam )
{ ? ?//PUSH BUTTON
? ? CreateWindow( "BUTTON", "PushButton",
? ? ? ? WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,?
? ? ? ? 100, 50, 100, 30,?
? ? ? ? hWnd, (HMENU)1001, g_hInst, NULL );
? ? //三態按鈕
? ? CreateWindow( "BUTTON", "Auto3State",
? ? ? ? WS_CHILD|WS_VISIBLE|BS_AUTO3STATE|BS_PUSHLIKE,?
? ? ? ? 100, 100, 100, 30,?
? ? ? ? hWnd, (HMENU)2001, g_hInst, NULL );
? ? //分組按鈕
? ? CreateWindow( "BUTTON", "分組一",
? ? ? ? WS_CHILD|WS_VISIBLE|BS_GROUPBOX,?
? ? ? ? 50, 30, 250, 400,
? ? ? ? hWnd, (HMENU)3001, g_hInst, NULL );
? ? //多選按鈕 CheckBox
? ? CreateWindow( "BUTTON", "選項一",
? ? ? ? WS_CHILD|WS_VISIBLE|BS_AUTOCHECKBOX,?
? ? ? ? 100, 150, 100, 30,
? ? ? ? hWnd, (HMENU)4001, g_hInst, NULL );
? ? CreateWindow( "BUTTON", "選項二",
? ? ? ? WS_CHILD|WS_VISIBLE|BS_CHECKBOX,?
? ? ? ? 100, 180, 100, 30,
? ? ? ? hWnd, (HMENU)4002, g_hInst, NULL );
? ? // 單選按鈕
? ? CreateWindow( "BUTTON", "A",?
? ? ? ? WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP,
? ? ? ? 100, 240, 100, 30, hWnd,?
? ? ? ? (HMENU)5001, g_hInst, NULL );
? ? CreateWindow( "BUTTON", "B",?
? ? ? ? WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
? ? ? ? 100, 270, 100, 30, hWnd,?
? ? ? ? (HMENU)5002, g_hInst, NULL );
? ? CreateWindow( "BUTTON", "C",?
? ? ? ? WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON|WS_GROUP, ?//遇到WS_GROUP,表示新的一組單選按鈕
? ? ? ? 100, 300, 100, 30, hWnd,?
? ? ? ? (HMENU)5003, g_hInst, NULL );
? ? CreateWindow( "BUTTON", "D",?
? ? ? ? WS_CHILD|WS_VISIBLE|BS_AUTORADIOBUTTON,
? ? ? ? 100, 330, 100, 30, hWnd,?
? ? ? ? (HMENU)5004, g_hInst, NULL );
?
?? ?//創建記事本
?? ?CreateWindow( "EDIT", "Hello EDIT",
? ? ? ? WS_CHILD|WS_VISIBLE/*|WS_HSCROLL|
? ? ? ? WS_VSCROLL|ES_AUTOHSCROLL|
?? ??? ?ES_AUTOVSCROLL|ES_MULTILINE 多行*/|ES_PASSWORD,?
? ? ? ? 0, 0, 100, 50, hWnd,
? ? ? ? (HMENU)1001, g_hInst, NULL );
}
?
void OnCommand( HWND hWnd, UINT nMsg,
? ? WPARAM wParam, LPARAM lParam )
{ ? ?
? ? int nNotifyCode = HIWORD( wParam );
? ? int nEventID ? ?= LOWORD( wParam );
? ? switch( nEventID )
? ? {
? ? case 1001:
? ? ? ? {
? ? ? ? ? ? switch( nNotifyCode )
? ? ? ? ? ? {
? ? ? ? ? ? case BN_CLICKED:
? ? ? ? ? ? ? ? MessageBox( NULL, "Hello PushButton",
? ? ? ? ? ? ? ? ? ? "WinButton", MB_OK );
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? break;
?
? ? ?case 2001:
? ? ? ? {
? ? ? ? ? ? switch( nNotifyCode )
? ? ? ? ? ? {
? ? ? ? ? ? case BN_CLICKED:
? ? ? ? ? ? ? ? MessageBox( NULL, "Hello Auto3State",
? ? ? ? ? ? ? ? ? ? "WinButton", MB_OK );
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? break;
? ? case 4002:
? ? ? ? {
? ? ? ? ? ? HWND hCtrl = GetDlgItem( hWnd, 4002 );
? ? ? ? ? ? LRESULT nCheck = 0;
? ? ? ? ? ? switch( nNotifyCode )
? ? ? ? ? ? {
? ? ? ? ? ? case BN_CLICKED:
? ? ? ? ? ? ? ? //獲取當前CheckBox的狀態
? ? ? ? ? ? ? ? nCheck = SendMessage( hCtrl,?
? ? ? ? ? ? ? ? ? ? BM_GETCHECK, 0, 0 );
? ? ? ? ? ? ? ? //判斷當前狀態是否被選擇
? ? ? ? ? ? ? ? if( nCheck & BST_CHECKED )
? ? ? ? ? ? ? ? { ? ?//設置為不選擇狀態
? ? ? ? ? ? ? ? ? ? SendMessage( hCtrl,BM_SETCHECK,
? ? ? ? ? ? ? ? ? ? ? ? BST_UNCHECKED, 0 );
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? { ? ?//設置成選擇狀態
? ? ? ? ? ? ? ? ? ? SendMessage( hCtrl,BM_SETCHECK,
? ? ? ? ? ? ? ? ? ? ? ? BST_CHECKED, 0 );
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? break;
? ? }
}
?
LRESULT CALLBACK WndProc( HWND ? hWnd,?
? ? ? ? ? ? ? ? ? ? ? ? ? UINT ? nMsg,
? ? ? ? ? ? ? ? ? ? ? ? ? WPARAM wParam,
? ? ? ? ? ? ? ? ? ? ? ? ? LPARAM lParam )
{
? ? switch( nMsg )
? ? {
? ? case WM_CREATE:
? ? ? ? OnCreate( hWnd, nMsg, wParam, lParam );
? ? ? ? break;
? ? case WM_COMMAND:
? ? ? ? OnCommand( hWnd, nMsg, wParam, lParam );
? ? ? ? break;
? ? case WM_DESTROY:
? ? ? ? PostQuitMessage( 0 );
? ? ? ? return 0;
? ? }
? ? return DefWindowProc( hWnd, nMsg,
? ? ? ? wParam, lParam );
}
?
BOOL RegisterWnd( LPSTR pszClassName )
{
? ? WNDCLASSEX wce = { 0 };
? ? wce.cbSize ? ? ? ?= sizeof( wce );
? ? wce.cbClsExtra ? ?= 0;
? ? wce.cbWndExtra ? ?= 0;
? ? wce.hbrBackground = HBRUSH(COLOR_WINDOW);
? ? wce.hCursor ? ? ? = NULL;
? ? wce.hIcon ? ? ? ? = NULL;
? ? wce.hIconSm ? ? ? = NULL;
? ? wce.hInstance ? ? = g_hInst;
? ? wce.lpfnWndProc ? = WndProc;
? ? wce.lpszClassName = pszClassName;
? ? wce.lpszMenuName ?= NULL;
? ? wce.style ? ? ? ? = CS_HREDRAW|CS_VREDRAW;
?
? ? ATOM nAtom = RegisterClassEx( &wce );
? ? if( 0 == ?nAtom )
? ? {
? ? ? ? return FALSE;
? ? }
?
? ? return TRUE;
}
?
HWND CreateWnd( LPSTR pszClassName )
{
? ? HWND hWnd = CreateWindowEx( 0,
? ? ? ? pszClassName, "MyWnd",?
? ? ? ? WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
? ? ? ? CW_USEDEFAULT, CW_USEDEFAULT,
? ? ? ? CW_USEDEFAULT, NULL, NULL, g_hInst,
? ? ? ? NULL );
? ? return hWnd;
}
?
void DisplayWnd( HWND hWnd )
{
? ? ShowWindow( hWnd, SW_SHOW );
? ? UpdateWindow( hWnd );
}
?
void Message( )
{
? ? MSG msg = { 0 };
? ? while( GetMessage( &msg, NULL, 0, 0 ) )
? ? {
? ? ? ? TranslateMessage( &msg );
? ? ? ? DispatchMessage( &msg );
? ? }
}
?
int APIENTRY WinMain(HINSTANCE hInstance,
? ? ? ? ? ? ? ? ? ? ?HINSTANCE hPrevInstance,
? ? ? ? ? ? ? ? ? ? ?LPSTR ? ? lpCmdLine,
? ? ? ? ? ? ? ? ? ? ?int ? ? ? nCmdShow)
{
? ? g_hInst = hInstance;
? ? RegisterWnd( "MYWND" );
? ? HWND hWnd = CreateWnd( "MYWND" );
? ? DisplayWnd( hWnd );
? ? Message( );
? ? return 0;
}

?1 文本編輯框的樣式
????1.1 單行文本編輯框 - 默認樣式
????1.2 多行文本編輯框 - ES_MULTILINE
????1.3 密碼文本編輯框 - ES_PASSWORD
??2 文本編輯框的使用
????2.1 創建?
???????窗口類名稱EDIT.
????2.2 Notify消息
???????EN_CHANGE 當編輯框內容發生變化時,會通知父窗口
????2.3 EDIT窗口消息
???????EM_SETSEL 選擇消息 WPARAM是起始字符位置
???????????LPARAM是終止字符位置
???????窗口消息: WM_COPY, WM_PASET,WM_CUT等消息
?????????WM_SETTEXT, WM_GETTEXT, WM_GETTEXTLEN
?????????SetWindowText
?????????GetWindowText/GetWindowTextLen


/* File : WinEdit.cpp
?* Auth : sjin
?* DATE : 20140720
?* MAil :?
?*/
?
#include <Windows.h>
#include <stdlib.h>
#include <stdio.h>
#include "resource.h"
?
?
HINSTANCE g_hInst = NULL;
HWND ? ? ?g_hEdit = NULL;
?
void OnCreate( HWND hWnd, UINT nMsg,?
? ? WPARAM wParam, LPARAM lParam )
{
? ? g_hEdit = CreateWindow( "EDIT", "Hello EDIT",
? ? ? ? WS_CHILD|WS_VISIBLE|WS_HSCROLL|
? ? ? ? WS_VSCROLL|ES_AUTOHSCROLL|
? ? ? ? ES_AUTOVSCROLL|ES_MULTILINE,?
? ? ? ? 0, 0, 100, 200, hWnd,
? ? ? ? (HMENU)1001, g_hInst, NULL );
}
?
void OnSize( HWND hWnd, UINT nMsg,?
? ? WPARAM wParam, LPARAM lParam )
{
? ? int nWidth = LOWORD( lParam );
? ? int nHeight= HIWORD( lParam );
? ? if( NULL != g_hEdit )
? ? { ? ?//將EDIT窗口填滿整個客戶區
? ? ? ? MoveWindow( g_hEdit, 0, 0, nWidth,
? ? ? ? ? ? nHeight, TRUE );
? ? }
}
?
void OnSave( )
{
? ? //獲取文字長度
? ? LRESULT nTextLen = SendMessage( g_hEdit,?
? ? ? ? WM_GETTEXTLENGTH, 0, 0 );
? ? //獲取文字
? ? CHAR * pszBuff = NULL;
? ? pszBuff = (CHAR *)malloc( nTextLen + 1 );
? ? memset( pszBuff, 0, nTextLen + 1 );
? ? SendMessage( g_hEdit, WM_GETTEXT,
? ? ? ? nTextLen + 1, (LPARAM)pszBuff );
? ? MessageBox( NULL, pszBuff, "WinEdit", MB_OK );
? ? //保存文件
? ? FILE * pFile = fopen( "D:\\1.txt", "w+" );
? ? fwrite( pszBuff, nTextLen, 1, pFile );
? ? fclose( pFile );
? ? //釋放內存
? ? free( pszBuff );
}
?
void OnOpen( )
{
? ? //打開文件讀取數據
? ? FILE * pFile = fopen( "D:\\1.txt", "r" );
? ? //獲取文件長度
? ? fseek( pFile, 0, SEEK_END );
? ? long nFileLen = ftell( pFile );
? ? fseek( pFile, 0, SEEK_SET );
? ? //讀取文件數據
? ? CHAR * pszBuf = (CHAR *)
? ? ? ? malloc( nFileLen + 1 );
? ? memset( pszBuf, 0, nFileLen + 1 );
? ? fread( pszBuf, nFileLen, 1, pFile );
? ? //關閉文件
? ? fclose( pFile );
? ? //將字符顯示在EDIT窗口
? ? SendMessage( g_hEdit, WM_SETTEXT,
? ? ? ? 0, (LPARAM)pszBuf );
? ? //釋放內存
? ? free( pszBuf );
}
?
void ?OnCommand( HWND hWnd, UINT nMsg,?
? ? WPARAM wParam, LPARAM lParam )
{
? ? int nNotifyCode = HIWORD( wParam );
? ? int nEventID ? ?= LOWORD( wParam );
? ? switch( nEventID )
? ? {
? ? case 1001:
? ? ? ? {
? ? ? ? ? ? switch( nNotifyCode )
? ? ? ? ? ? {
? ? ? ? ? ? case EN_CHANGE:
? ? ? ? ? ? ? ? //MessageBox( NULL, "EN_CHANGE",
? ? ? ? ? ? ? ? // ? ?"WinEdit", MB_OK );
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? break;
? ? case ID_SELALL:
? ? ? ? SendMessage( g_hEdit, EM_SETSEL, 0, -1 );
? ? ? ? break;
? ? case ID_COPY://復制
? ? ? ? SendMessage( g_hEdit, WM_COPY, 0, 0 );
? ? ? ? break;
? ? case ID_PASTE:
? ? ? ? SendMessage( g_hEdit, WM_PASTE, 0, 0 );
? ? ? ? break;
? ? case ID_SAVE:
? ? ? ? OnSave( );
? ? ? ? break;
? ? case ID_OPEN:
? ? ? ? OnOpen( );
? ? ? ? break;
? ? }
}
?
LRESULT CALLBACK WndProc( HWND ? hWnd,?
? ? ? ? ? ? ? ? ? ? ? ? ? UINT ? nMsg,
? ? ? ? ? ? ? ? ? ? ? ? ? WPARAM wParam,
? ? ? ? ? ? ? ? ? ? ? ? ? LPARAM lParam )
{
? ? switch( nMsg )
? ? {
? ? case WM_CREATE:
? ? ? ? OnCreate( hWnd, nMsg, wParam, lParam );
? ? ? ? break;
? ? case WM_SIZE:
? ? ? ? OnSize( hWnd, nMsg, wParam, lParam );
? ? ? ? break;
? ? case WM_COMMAND:
? ? ? ? OnCommand( hWnd, nMsg, wParam, lParam );
? ? ? ? break;
? ? case WM_DESTROY:
? ? ? ? PostQuitMessage( 0 );
? ? ? ? return 0;
? ? }
? ? return DefWindowProc( hWnd, nMsg,
? ? ? ? wParam, lParam );
}
?
BOOL RegisterWnd( LPSTR pszClassName )
{
? ? WNDCLASSEX wce = { 0 };
? ? wce.cbSize ? ? ? ?= sizeof( wce );
? ? wce.cbClsExtra ? ?= 0;
? ? wce.cbWndExtra ? ?= 0;
? ? wce.hbrBackground = HBRUSH(COLOR_WINDOW);
? ? wce.hCursor ? ? ? = NULL;
? ? wce.hIcon ? ? ? ? = NULL;
? ? wce.hIconSm ? ? ? = NULL;
? ? wce.hInstance ? ? = g_hInst;
? ? wce.lpfnWndProc ? = WndProc;
? ? wce.lpszClassName = pszClassName;
? ? wce.lpszMenuName ?= NULL;
? ? wce.style ? ? ? ? = CS_HREDRAW|CS_VREDRAW;
?
? ? ATOM nAtom = RegisterClassEx( &wce );
? ? if( 0 == ?nAtom )
? ? {
? ? ? ? return FALSE;
? ? }
?
? ? return TRUE;
}
?
HWND CreateWnd( LPSTR pszClassName )
{
? ? HMENU hMenu = LoadMenu( g_hInst,
? ? ? ? MAKEINTRESOURCE(IDR_MAIN) );
? ? HWND hWnd = CreateWindowEx(?
? ? ? ? WS_EX_CLIENTEDGE,
? ? ? ? pszClassName, "我的記事本",?
? ? ? ? WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
? ? ? ? CW_USEDEFAULT, CW_USEDEFAULT,
? ? ? ? CW_USEDEFAULT, NULL, hMenu, g_hInst,
? ? ? ? NULL );
? ? return hWnd;
}
?
void DisplayWnd( HWND hWnd )
{
? ? ShowWindow( hWnd, SW_SHOW );
? ? UpdateWindow( hWnd );
}
?
void Message( )
{
? ? MSG msg = { 0 };
? ? while( GetMessage( &msg, NULL, 0, 0 ) )
? ? {
? ? ? ? TranslateMessage( &msg );
? ? ? ? DispatchMessage( &msg );
? ? }
}
?
int APIENTRY WinMain(HINSTANCE hInstance,
? ? ? ? ? ? ? ? ? ? ?HINSTANCE hPrevInstance,
? ? ? ? ? ? ? ? ? ? ?LPSTR ? ? lpCmdLine,
? ? ? ? ? ? ? ? ? ? ?int ? ? ? nCmdShow)
{
? ? g_hInst = hInstance;
? ? RegisterWnd( "MYWND" );
? ? HWND hWnd = CreateWnd( "MYWND" );
? ? DisplayWnd( hWnd );
? ? Message( );
? ? return 0;
}


參考資料:

其他控件介紹:

http://www.cnblogs.com/tangzhengyue/archive/2012/08/16/2643149.html

?

總結

以上是生活随笔為你收集整理的【转】走进windows编程的世界-----对话框、文本框、按钮的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。