C語言API編寫窗體界麵和按鈕
最近有個同學的程序需要用對話框的方式實現,但前麵都是通過黑框形式完成的,老師突然讓增加一個界麵,本來準備采用MFC完成的,但後來一想,該程序核心東西是體現在它的算法上,控製台的程序並非不好.轉念一想,如果使用MFC這樣的方法好像需要再倒騰一遍,想到了大一在"C語言能幹大事"中的東西,所以就準備采用這種形式直接完成,投機取巧的方法.主要是通過調用Windows API界麵的CreateWindows函數完成,同時也能創建按鈕,把參數設置為button,如果想響應該按鈕,隻需在回調函數中增加消息WM_COMMAND判斷即可.代碼如下:
#include<windows.h>
#include<stdio.h>
//聲明回調函數
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
//主函數 程序入口
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ; //用來保存成功創建窗口後返回的句柄
MSG msg ; //定義消息結構體變量
WNDCLASS wndclass ; //窗體類
wndclass.style = CS_HREDRAW | CS_VREDRAW ; //指定窗口風格
wndclass.lpfnWndProc = WndProc ; ////函數指針,指向處理窗口消息的函數入口
wndclass.cbClsExtra = 0 ; //結構體後附加的字節數,一般總為0
wndclass.cbWndExtra = 0 ; //窗體實例附加的字節數,一般總為0
wndclass.hInstance = hInstance ; //模塊句柄
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //圖標句柄 任務欄顯示的圖標
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //光標句柄
wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //背景顏色COLOR_BACKGROUND
wndclass.lpszMenuName = NULL ; //菜單名的字符串
wndclass.lpszClassName = szAppName ; //自定義類名,不要與其他類名重複
if (!RegisterClass (&wndclass))
{
MessageBox (NULL, TEXT ("注冊類失敗!"), szAppName, MB_ICONERROR) ;
return 0 ;
}
int x =((GetSystemMetrics(SM_CXSCREEN)/2)-200); //x居中
int y =((GetSystemMetrics(SM_CYSCREEN)/2)-200); //y居中
//創建窗體API
hwnd = CreateWindow(szAppName,TEXT("畢業設計"),WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX,x,y,400,400,NULL,NULL,hInstance,NULL);
//顯示窗體的API 傳入需要顯示的窗體句柄和顯示方式
ShowWindow(hwnd,iCmdShow);
//刷新窗體的API
UpdateWindow(hwnd);
//從係統的應用程序線程消息隊列中取得一個消息
while(GetMessage(&msg,NULL,0,0) > 0)
{
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc; //句柄
PAINTSTRUCT ps;
RECT rect; //矩形
HINSTANCE hInstance; //窗口實例
static HWND hwndButton[2]; //按鈕句柄
switch (message)
{
case WM_CREATE: //創建按鈕
{
hInstance = ((LPCREATESTRUCT)lParam)->hInstance;
//按鈕1
hwndButton[0] = CreateWindow("BUTTON","訓練",
WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
10,10,100,100,hwnd,NULL,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
//按鈕2
hwndButton[1] = CreateWindow("BUTTON","獲取",
WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
10,250,100,100,hwnd,NULL,
(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);
return 0;
}
case WM_PAINT: //繪製文字
hdc = BeginPaint(hwnd,&ps);
GetClientRect(hwnd,&rect);
DrawText(hdc,TEXT("By:Eastmount CSDN製作"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);
EndPaint(hwnd,&ps);
return 0;
case WM_COMMAND: //響應按鈕消息
if((HWND)lParam == hwndButton[0])
{
MessageBox(NULL,TEXT("是否訓練圖片?"),TEXT("提示"),MB_YESNO|MB_ICONQUESTION);
}
if((HWND)lParam == hwndButton[1])
{
MessageBox(NULL,TEXT("是否獲取圖片?"),TEXT("提示"),MB_YESNO|MB_ICONQUESTION);
}
return 0;
case WM_CLOSE: //關閉
if(IDYES==MessageBox(hwnd,"是否關閉程序?","提示",MB_YESNO|MB_ICONQUESTION))
{
DestroyWindow (hwnd);
}
return 0;
case WM_DESTROY: //退出程序
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
程序運行結果如下圖所示:

其中主要涉及到的函數原型如下所示:
//創建窗體 hwnd = CreateWindow ( szClassName, /* Classname */ "Windows App", /* Title Text */ WS_OVERLAPPEDWINDOW, /* default window */ CW_USEDEFAULT, /* Windows decides the position */ CW_USEDEFAULT, /* where the window ends up on the screen */ 544, /* The programs width */ 375, /* and height in pixels */ HWND_DESKTOP, /* The window is a child-window to desktop */ NULL, /* No menu */ hThisInstance, /* Program Instance handler */ NULL /* No Window Creation data */ ); //創建按鈕 hwndButton = CreateWindow( "BUTTON", // predefined class "OK", // button text WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // styles 10, // starting x position 10, // starting y position 100, // button width 100, // button height hwnd, // parent window NULL, // No menu (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), NULL // pointer not needed );最後,寫這篇文章主要是懷念自己大一時的生活,從一個什麼都不知道的孩子,通過學習C語言,C語言能幹大事開始接觸編程.同時,我認為這個程序也是非常還的入門程序,希望剛接觸程序的同學也可以看看,編編自己感興趣的程序、寫寫博客、AC題目、編寫遊戲、聊天軟件、移動開發,能從程序和生活中找到一些讓自己心靈美妙的東西.
(By:Eastmount 2014-5-25 夜2點半 原創CSDNhttps://blog.csdn.net/eastmount/)
最後更新:2017-04-03 08:26:15