如果要實現(xiàn)點擊一個按鈕,然后將輸入框中的輸入的內容在彈出的提示框中顯示出來這個功能的話,使用大部分可視化IDE開發(fā)工具都是很簡單的事情,用鼠標拖拖控件不用幾分鐘就可以實現(xiàn).
當然了,如果真按照以上方式實現(xiàn)這個功能然后寫成一篇文章的話也就有點太敷衍了.所以,為了加大難度,在這里我們要使用C語言來實現(xiàn)這個功能.界面功能全部用代碼實現(xiàn),想想就有點高大上是不是.
首先,我們要先創(chuàng)建窗口.需要創(chuàng)建一個主窗口和3個控件(子窗口).主窗口需要先注冊,而控件則不需要,系統(tǒng)已經為我們預先注冊了常用的控件,我們直接創(chuàng)建對應的控件即可.這里我們使用了BUTTON按鈕控件肛搬、static靜態(tài)文本控件冬三、EDIT編輯控件.都是使用CreateWindow函數(shù)來創(chuàng)建的,函數(shù)定義如下:
HWND WINAPI CreateWindow(? _In_opt_?LPCTSTR ??lpClassName,? _In_opt_?LPCTSTR ??lpWindowName,? _In_?????DWORD ????dwStyle,? _In_intx,? _In_inty,? _In_intnWidth,? _In_intnHeight,? _In_opt_?HWND ?????hWndParent,? _In_opt_?HMENU ????hMenu,? _In_opt_?HINSTANCE hInstance,? _In_opt_?LPVOID ???lpParam);
第一個參數(shù)用于指定不同類型的窗口,第九個參數(shù)指定控件唯一ID,相關參數(shù)都可以在msdn找到的,這里不展開來寫了,以后我的資料庫會對這些內容進行詳細描寫.
//創(chuàng)建窗口
BOOL InitInstance(HINSTANCE hinstance,int nCmdShow){
HWND hwnd;
RECT rect;
//保存應用程序實例句柄
hinst = hinstance;
hwnd = CreateWindow(
"MainWClass",//窗口類名,使用之前注冊的主窗口類
"御坂網(wǎng)絡歡迎你",//窗口名,顯示在串口標題欄上的字符串
WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUPWINDOW,//窗口樣式
CW_USEDEFAULT,//水平位置(默認)
CW_USEDEFAULT,//垂直位置(默認)
800,//高
600,//寬
(HWND)NULL,//無父窗口
(HMENU)NULL,//菜單
hinstance,//應用程序實例
(LPVOID)NULL//無窗口創(chuàng)建數(shù)據(jù)
);
//窗口是否創(chuàng)建成功
if(!hwnd){
return FALSE;
}
hwndbutton = ?CreateWindow(
"BUTTON",//窗口類名,使用之前注冊的主窗口類
"按鈕",//窗口名,顯示在串口標題欄上的字符串
WS_CHILD | WS_VISIBLE |BS_PUSHBUTTON,//窗口樣式
420,//水平位置(默認)
90,//垂直位置(默認)
120,//寬
40,//高
(HWND)hwnd,//無父窗口
(HMENU)1,//菜單
(HINSTANCE)NULL,//應用程序實例
(LPVOID)NULL//無窗口創(chuàng)建數(shù)據(jù)
);
hwndstatic = CreateWindow(
TEXT("static"),
TEXT("你好"),
WS_CHILD | WS_VISIBLE | WS_BORDER,
420,0,150,80,
(HWND)hwnd,
(HMENU)2,
(HINSTANCE)NULL,
(LPVOID)NULL
);
hwndedit = CreateWindow(
"EDIT",
"666",
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_BORDER | ES_LEFT |ES_MULTILINE | ES_AUTOVSCROLL,
0,0,400,200,
(HWND)hwnd,
(HMENU)3,
(HINSTANCE)NULL,
(LPVOID)NULL
);
//窗口是否創(chuàng)建成功
if(!hwndbutton){
return FALSE;
}
ShowWindow(hwnd,nCmdShow);
UpdateWindow(hwnd);
return TRUE;
}
窗口創(chuàng)建完成之后就是顯示窗口,更新窗口.之后消息循環(huán)
我們要在消息循環(huán)對一些事件進行處理.也就是實現(xiàn)我們標題所述功能,這個剛開始我也完全沒有頭緒,不過最后還是實現(xiàn)了通過WM_COMMAND消息獲取點擊按鈕事件進行處理,GetWindowText函數(shù)獲取編輯框內容,最終實現(xiàn)點擊按鈕彈出提示框.
//消息處理函數(shù)
LRESULT CALLBACK MainWndProc(
HWND hwnd,//窗口句柄
UINT uMsg,//消息標識符
WPARAM wParam,//消息的第一個參數(shù)
LPARAM lParam//消息的第二個參數(shù)
){
int wmId, wmEvent;
switch(uMsg){
case WM_CREATE://窗口創(chuàng)建時收到此消息
break;
case WM_PAINT://窗口被繪制時收到此消息
break;
case WM_SIZE://窗口大小改變時收到此消息
//OnWindowResize();
break;
case WM_NOTIFY:// NOTIFY 通常由控件發(fā)送給其父窗口,說明控件正在進行某項串口操作
break;
case WM_DESTROY://窗口銷毀,單擊右上角的關閉按鈕會觸發(fā)此消息
PostQuitMessage(0);
break;
case WM_COMMAND:
wmId ? ?= LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId){
case 1: ?//按下按鈕
//更改文本框的內容
SetWindowText( hwndstatic, TEXT("你點擊了下面的按鈕") );
LPTSTR lpString[128];
GetWindowText(hwndedit,lpString,128);
MessageBox(NULL,lpString,"輸入的內容是",MB_OK);
break;
default:
//MessageBox(NULL,"dd","ee",MB_OK);
//不處理的消息一定要交給 DefWindowProc 處理。
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
break;
default://可以在此處理其他消息
break;
}
//有很多消息未做處理,需要由默認串口消息處理函數(shù)來處理
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
通過上面的消息處理函數(shù),我們的程序就可以響應我們的點擊按鈕事件了.最終效果如圖
當然還要加下面這些聲明和代碼WinMain函數(shù)才可以運行
#define _WIN32_WINNT 0x0501
#include
#include
BOOL InitApplication(HINSTANCE hinstance);
BOOL InitInstance(HINSTANCE hinstance,int nCmdShow);
LRESULT CALLBACK MainWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
HINSTANCE hinst; //應用程序實例句柄
HWND hwndMain; //保留窗口句柄
HWND hwndbutton;//按鈕
HWND hwndstatic;//靜態(tài)文字框
HWND hwndedit;//編輯框
int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
MSG msg;
BOOL fGotMessage;
//注冊窗口
if(!InitApplication(hinstance)){
return FALSE;
}
//創(chuàng)建窗口
if(!InitInstance(hinstance,nCmdShow)){
return FALSE;
}
//消息循環(huán)
while((fGotMessage = GetMessage(&msg,(HWND)NULL,0,0)) != 0 && fGotMessage != -1){
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
功能很簡單,但是代碼一點也不少哎.不過這樣寫代碼有助于我們理解程序的執(zhí)行過程,所以我是比較喜歡用這種方式寫代碼的.以上就是這篇文章的全部內容了,寫的比較小白畢竟自己也是處于學習階段還寫不錯高深的內容.