tft每日頭條

 > 科技

 > c語言有哪些開發工具及用法

c語言有哪些開發工具及用法

科技 更新时间:2024-11-25 12:23:44
C Window API 學習筆記 - 标準控件調用代碼演示一;按鈕1:按鈕的種類

按鈕控件允許用戶通過單擊來執行操作,其功能可以顯示文本,又可以顯示圖像,當按鈕被單擊的時候,它看起來被按下,然後被釋放。按鈕是Windows标準控件。也是子窗口,其窗口類名為button。

其主要分為如下:

  • 按鈕(Button)
  • 單選按鈕(Radio Button)
  • 複選按鈕(Check Button)
2;按鈕消息

對于我們操作按鈕,同樣會産生消息。一般按鈕控件會向父窗口發送命令消息“WM_COMMAND”消息。即我們如果需要處理按鈕控件,可以匹配“WM_COMMAND”消息。其他簡單消息如下:

BN_CLICKED用戶在按鈕上單擊鼠标時,會向父窗口發送BN_CLICKED消息

BN_DOUBLECLICKED雙擊鼠标時會向父窗口發送BN_DOUBLECLICKED消息。

3;位圖按鈕

對于我們操作按鈕,除了使用操作系統自帶的外觀,同樣可以使用圖片來修飾按鈕。參考代碼:

程序邏輯如下:

  1. 使用"BS_BITMAP"格式來創建按鈕。
  2. 使用函數LoadImage() 來導入位圖。
  3. 調用SendMessage()來綁定按鈕與位圖。

case WM_CREATE: { LPCREATESTRUCT pcs = (LPCREATESTRUCT)LPARAM; //創建位圖按鈕 HWND hBtn = CreateWindow(L"BuTtOn" /*不區分大小寫*/, L"XXX", WS_CHILD | WS_VISIBLE | BS_BITMAP,//指定為圖片 30, 30, 217, 46, hWnd, (HMENU)1000, pcs->hInstance, NULL); //加載位圖 HBITMAP hBmp=(HBITMAP)LoadImage(NULL, L"C:\\Users\\35497\\Desktop\\code\\016\\Debug\\btn1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); //向控件發送BM_SETIMAGE消息設置按鈕圖片 LRESULT ret=SendMessage(hBtn, BM_SETIMAGE, (WPARAM)IMAGE_BITMAP, (LPARAM)hBmp); return 0; }

N:案例

程序注釋

  • 按鈕本質也是窗口,所以可以通過匹配消息“WM_CREATE”,調用CreateWindow()函數來創建。
  • 每個控件都有唯一的ID值。

#include <Windows.h> #include <windowsx.h> #include <stdio.h> //自定義窗口過程 LRESULT CALLBACK MyWindowProc(HWND hWnd, UINT MSG, WPARAM wParam, LPARAM IParam) { switch (Msg) { //////////////////////////// 創建按鈕控件 ////////////////////////////////// case WM_CREATE: { /*LPCREATESTRUCT定義傳遞給應用程序的窗口過程的初始化參數。這些成員與CreateWindowEx函數的參數相同。*/ LPCREATESTRUCT pcs = (LPCREATESTRUCT)IParam; //創建控件或者子窗口 //普通按鈕BS_PUSHBUTTON HWND hBtn = CreateWindow(L"Button", L"普通按鈕", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 30, 30, 80, 30, hWnd, (HMENU)1000,//控件ID,需要唯一 pcs->hInstance, //父窗口句柄 NULL); //單選按鈕 HWND hBtn1 = CreateWindow(L"Button", L"單選按鈕", WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON, 30, 60, 80, 30, hWnd, (HMENU)1001,//控件ID,需要唯一 pcs->hInstance, //父窗口句柄 NULL); //複選按鈕 HWND hBtn2 = CreateWindow(L"Button", L"複選按鈕", WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX, 30, 90, 80, 30, hWnd, (HMENU)1002,//控件ID,需要唯一 pcs->hInstance, //父窗口句柄 NULL); return 0; } case WM_COMMAND: { WORD id = LOWORD(wParam); WORD code = HIWORD(wParam); HWND hCtrl = (HWND)IParam; if (id == 1000 && code == BN_CLICKED) { MessageBox(hWnd, L"普通按鈕被單擊!", L"提示", MB_OK); } else if (id == 1001) { MessageBox(hWnd, L"單選按鈕被單擊!", L"提示", MB_OK); if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_CHECKED) { MessageBox(hWnd, L"被選中!", L"提示", MB_OK); } else if (SendMessage(hCtrl, BM_GETCHECK, 0, 0) == BST_UNCHECKED) { MessageBox(hWnd, L"未選中!", L"提示", MB_OK); } } else if (id == 1002) { MessageBox(hWnd, L"複選按鈕被單擊!", L"提示", MB_OK); if (Button_GetCheck(hCtrl) == BST_CHECKED) { MessageBox(hWnd, L"被選中!", L"提示", MB_OK); } else if (Button_GetCheck(hCtrl) == BST_UNCHECKED) { MessageBox(hWnd, L"未選中!", L"提示", MB_OK); } } }break; default: return DefWindowProcW(hWnd, Msg, wParam, IParam); } return 0; } //主函數 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine, int nCmdShow) //int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { //注冊窗口類 WNDCLASS wind; wind.cbClsExtra = 0; wind.cbWndExtra = 0; wind.hbrBackground = (HBRUSH)(GetStockObject(GRAY_BRUSH));// 設定背景色 wind.hCursor = LoadCursor(NULL, IDC_ARROW); //光标 wind.hIcon = LoadCursor(NULL, IDI_APPLICATION);//圖标 wind.lpfnWndProc = MyWindowProc; //自定義的窗口過程函數 wind.lpszClassName = L"Aaron.xu"; //窗口類名 wind.lpszMenuName = NULL; // 菜單資源名稱 wind.style = CS_HREDRAW;//窗口類,樣式 wind.hInstance = hInstance;//實例句柄 RegisterClass(&wind); //注冊窗口類 //創建窗口 HWND hWnd = CreateWindow(L"Aaron.xu", L"天象獨行", WS_OVERLAPPEDWINDOW, 100, 100, 300, 300, NULL, NULL, hInstance, NULL); //顯示窗口 //ShowWindow(hWnd, nShowCmd); ShowWindow(hWnd, nCmdShow); //更新窗口 UpdateWindow(hWnd); //消息循環(收到WM_QUIT消息退出) MSG msg; while (GetMessage(&msg, NULL, 0, 0)) //GetMessage()從消息隊列取出消息 { TranslateMessage(&msg); //将虛拟鍵消息轉換為字符消息 DispatchMessage(&msg); //将WM_AAA消息分配窗口過程MyWindowProc } }

二;靜态文本

靜态文本控件是一種最簡單的控件,它主要用來顯示文本消息,不能接受用戶輸入,一般不需要處理消息。靜态文本框控件既是Windows标準控件,也是子窗口,它的窗口類名是static

一個靜态控件用來顯示一個文本字符串,框,矩形,圖标,光标,位圖,或增強的圖元文件。它可以用來作為标簽,框,或用來分隔其他的控件。一個靜态控件不接受輸入,也不提供輸出;但是如果是由“SS_NOTIFY”風格創建的,則它可以通知其父關系設備點擊消息。

c語言有哪些開發工具及用法(CWindowAPI)1

2.1;靜态文本控制發送消息

可以向靜态文本控件發送消息來設置圖标,位圖等

c語言有哪些開發工具及用法(CWindowAPI)2

靜态文本控件向父窗口發送命令消息“WM_COMMAND”。消息種類如下:

c語言有哪些開發工具及用法(CWindowAPI)3

2;舉例:

其中僅包含窗口過程部分

case WM_CREATE: { //CreateWindow函數在窗口創建成功并且在返回之前直接發送WM_CREATE消息給窗口過程函數。 LPCREATESTRUCT pcs = (LPCREATESTRUCT)IParam; //創建靜态文本控件 HWND hStatic = CreateWindow(L"Static", L"靜态文本", WS_CHILD | WS_VISIBLE | WS_BORDER|SS_NOTIFY, 30, 30, 200, 30, hWnd, (HMENU)111, pcs->hInstance, NULL); //更改窗口标題 SetWindowText(hWnd, L"123123"); //設置控件(子窗口)内容 SetWindowText(hStatic, L"更改後的内容!"); //加載位圖 HBITMAP hBmp = LoadBitmap(pcs->hInstance, MAKEINTRESOURCE(IDB_BITMAP1)); //向孔健發送STM_SETIMAGE消息設置靜态控件的位圖 SendMessage(hStatic, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBmp); return 0; } case WM_COMMAND: { WORD id = LOWORD(wParam);//控件ID WORD code = HIWORD(wParam); //消息類型 HWND hCtrl = (HWND)IParam;//窗口句柄 //父窗口接收到子控件發的消息 if (id == 111 && code == STN_CLICKED) { MessageBox(NULL, L"靜态文本被點擊!", L"提示", MB_OK); } break;

三;編輯框

演示代碼(僅包含窗口過程代碼部分):

case WM_CREATE: { //LPCREATESTRUCT定義傳遞給應用程序的窗口過程的初始化參數。這些成員與CreateWindowEx函數的參數相同。 LPCREATESTRUCT pcs = (LPCREATESTRUCT)IParam; //創建編程框控件 HWND hEdit = CreateWindow(L"ediT", L"編輯框", WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL | ES_NOHIDESEL, 30, 30, 200, 100, hWnd, (HMENU)111, pcs->hInstance, NULL); //向編輯框發送選擇字符串得消息 SendMessage(hEdit, EM_SETSEL, 2, 6); //剪切剛剛選擇的文字 //SendMessage(hEdit, WM_CUT, 0, 0); //撤銷 //SendMessage(hEdit, EM_UNDO, 0, 0); return 0; } case WM_COMMAND: { WORD id = LOWORD(wParam); //控件ID WORD code = HIWORD(wParam);//消息類型 HWND hCtrl = (HWND)IParam;//窗口句柄 //父窗口接收到子控件發得通知代碼 //EN_CHANGE 當用戶執行的操作可能更改了編輯控件中的文本時發送。 if (id == 111 && code == EN_CHANGE) { //MessageBox(NULL, L"編輯框的文本被改變", L"提示", MB_OK); TCHAR buf[64] = { 0 }; GetWindowText(hCtrl, buf, sizeof(buf)); MessageBox(NULL, buf, L"提示", MB_OK); } }

四;列表框

演示代碼(僅包含窗口過程代碼部分):

case WM_CREATE: { LPCREATESTRUCT pcs = (LPCREATESTRUCT)IParam; //創建列表框控件 HWND hListBox = CreateWindow(L"listBOX", L"XXX", WS_CHILD | WS_VISIBLE | LBS_SORT | LBS_NOTIFY, 30, 30, 200, 100, hWnd, (HMENU)111, GetModuleHandle(NULL), NULL); //向末尾添加選項 SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"B音樂"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"A啤酒"); SendMessage(hListBox, LB_ADDSTRING, 0, (LPARAM)L"C啤酒"); //插入字符串 SendMessage(hListBox, LB_ADDSTRING, 1, (LPARAM)L"C炸雞"); //選擇其中一項,選擇索引為2的,單選模式才有效 SendMessage(hListBox, LB_SETCURSEL, 2, 0); return 0; } case WM_COMMAND: { WORD id = LOWORD(wParam);//控件ID WORD code = HIWORD(wParam);//消息類型 HWND hCtrl = (HWND)IParam;//窗口句柄 //父窗口接收到子控件發的消息 //LBN_SELCHANGE 通知應用程序列表框中的選定内容已因用戶輸入而發生更改。 if (id == 111 && code == LBN_SELCHANGE)//創建時需指定LBS_NOTIFY樣式 { // 獲取當前選擇的索引 int index = SendMessage(hCtrl, LB_GETCURSEL, 0, 0); //獲取索引對應的字符串 TCHAR buf[64] = { 0 }; //LB_GETTEXT從列表框中獲取一個字符串。 SendMessage(hCtrl, LB_GETTEXT, index, (LPARAM)buf); MessageBox(NULL, buf, L"提示", MB_OK); } }break;

五;組合框

演示代碼(僅包含窗口過程代碼部分):

case WM_CREATE: { LPCREATESTRUCT pcs = (LPCREATESTRUCT)IParam; //創建組合框 HWND hComboBox = CreateWindow(L"comboBOX", L"XXX", WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_SORT, 30, 30, 200, 100, hWnd, (HMENU)111, pcs->hInstance, NULL); //向組合框添加選項 SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)L"C音樂"); SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)L"A啤酒"); SendMessage(hComboBox, CB_ADDSTRING, 0, (LPARAM)L"B炸雞"); //插入選項 SendMessage(hComboBox, CB_INSERTSTRING, 2, (LPARAM)L"編程"); //選擇某一項 SendMessage(hComboBox, CB_SETCURSEL, 3, 0); return 0; } case WM_COMMAND: { WORD id = LOWORD(wParam);//控件ID WORD code = HIWORD(wParam);//消息類型 HWND hCtrl = (HWND)IParam;//窗口句柄 //父窗口接收到子控件發的消息 if (id == 111 && code == CBN_SELCHANGE) { //獲取當前選擇的索引 int index = SendMessage(hCtrl, CB_GETCURSEL, 0, 0); //獲取索引對應的文本 TCHAR buf[64] = { 0 }; SendMessage(hCtrl, CB_GETLBTEXT, index, (LPARAM)buf); MessageBox(hWnd, buf, L"提示", MB_OK); } }break;

六;滾動條

演示代碼(僅包含窗口過程代碼部分):

case WM_CREATE: { /* * 發送 SBM _ SETRANGE 消息,以設置滾動條控件的最小和最大位置值。 * 發送 SBM _ SETPOS 消息以便 (thumb) 設置滾動框位置,并在請求時重新繪制滾動條以反映滾動框的新位置。 */ LPCREATESTRUCT pcs = (LPCREATESTRUCT)IParam; //創建滾動條控件 HWND hScrollBar = CreateWindow(L"scrollBAR", L"XXX", WS_CHILD | WS_VISIBLE | SBS_HORZ, 30, 30, 200, 30, hWnd, (HMENU)111, pcs->hInstance, NULL); //設置滾動條的範圍 SendMessage(hScrollBar, SBM_SETRANGE, 0, 100); //設置滾動條的滑塊位置 SendMessage(hScrollBar, SBM_SETPOS, 40, 1); return 0; } //水平滾動條發送的消息 case WM_HSCROLL: { WORD code = LOWORD(wParam);//操作碼 HWND hCtrl = (HWND)IParam;//控件句柄 //獲取滾動條的滑塊位置 //發送 SBM _ GETPOS 消息以檢索滾動條控件的滾動框的當前位置。 當前位置是依賴于當前滾動範圍的相對值。 int pos = SendMessage(hCtrl, SBM_GETPOS, 0, 0); switch (code) { //點擊左邊箭頭 case SB_LINELEFT: OutputDebugString(L"SB_LINELEFT\n"); pos -= 1; break; //點擊右邊箭頭 case SB_LINERIGHT: OutputDebugString(L"SB_LINERIGHT\n"); pos = 1; break; //點擊左空白區 case SB_PAGELEFT: OutputDebugString(L"SB_PAGELEFT\n"); pos -= 10; break; //點擊右空白區 case SB_PAGERIGHT: OutputDebugString(L"SB_PAGERIGHT\n"); pos = 10; break; //拖動滑塊時的消息 case SB_THUMBPOSITION: pos = HIWORD(wParam);//拖拽位置,僅當SB_THUMBPOSITION有用 char str[64]; sprintf_s(str, "SB_THUMBPOSITION %d\n", pos); OutputDebugStringA(str); break; } //設置滾動條的滑塊位置 SendMessage(hCtrl, SBM_SETPOS, pos, 1); }break;

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved