《Windows API 每日一練》8.4 edit控件

編輯類是最簡單的預定義窗口類,而另一方面卻又是最復雜的。當你用“edit”作為類名創建子窗口時,可以基于CreateWindow調用的x坐標、y坐標、寬度和高度參數定義一個矩形。這個矩形包含可編輯的文本。一旦子窗口控件獲得輸入焦點,你就可以輸入文本,移動光標,使用鼠標或Shift鍵和光標鍵選擇部分文本,按快捷鍵 Ctrl - X刪除選中的文本并將其放入剪貼板中,按快捷鍵Ctrl - C復制文本,按快捷鍵Ctrl - V 從剪貼板粘貼文本。

本節必須掌握的知識點:

??? ????編輯類

??? ????第53練:編輯控件

8.4.1 編輯類

?????? ■編輯類的樣式

編輯類窗口(Edit Control)是用于接收和顯示文本輸入的窗口控件。可以使用樣式設置來改變編輯類窗口的外觀和行為。

以下是一些常用的編輯類窗口樣式:

ES_LEFT:文本左對齊(默認)。

ES_CENTER:文本居中對齊。

ES_RIGHT:文本右對齊。

ES_MULTILINE:多行編輯框,允許輸入多行文本。

ES_READONLY:只讀模式,禁止編輯。

ES_PASSWORD:密碼模式,輸入的文本以密碼字符顯示。

ES_NUMBER:數字模式,只允許輸入數字。

ES_AUTOHSCROLL:自動水平滾動,當文本超出控件寬度時自動水平滾動。

ES_AUTOVSCROLL:自動垂直滾動,當文本超出控件高度時自動垂直滾動。

ES_WANTRETURN:希望回車鍵產生換行效果,適用于多行編輯框。

這些樣式可以通過在創建編輯類窗口時使用 CreateWindowEx 或 CreateWindow 函數的 dwStyle 參數來設置。例如:

HWND hEdit = CreateWindowEx(

??? 0,????????????????????? // 擴展窗口樣式

??? L"EDIT",??????????????? ? // 窗口類名

??? L"Sample Text",???????? ?? // 窗口標題(初始文本)

??? WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,? // 窗口樣式

??? x, y, width, height,??? ??????? // 窗口位置和尺寸

??? hWndParent,???????????? // 父窗口句柄

??? (HMENU)IDC_EDIT,??????? // 控件標識符

??? hInstance,????????????? ?? // 應用程序實例句柄

??? NULL?????????????????? // 創建參數

);

在上述示例中,我們創建了一個編輯類窗口,并設置了一些常用的樣式,如可見、子窗口、帶邊框和左對齊。可以根據需求自由組合和設置其他樣式。

除了創建時設置樣式,還可以使用 SetWindowLongPtr 或 SetWindowLongPtr 函數來動態修改編輯類窗口的樣式。例如:

DWORD dwStyle = GetWindowLongPtr(hEdit, GWL_STYLE);

dwStyle |= ES_READONLY;? // 設置只讀樣式

SetWindowLongPtr(hEdit, GWL_STYLE, dwStyle);

在上述示例中,我們首先獲取編輯類窗口的當前樣式,然后通過按位或運算符將 ES_READONLY 樣式添加到樣式中,最后使用 SetWindowLongPtr 函數設置新的樣式。

需要注意的是,應在窗口創建之前或之后進行樣式修改。有些樣式只能在創建時設置,而有些樣式可以在創建后動態修改。

編輯控件的通知消息

編輯控件向其父窗口過程發送WM_COMMAND消息。相應的wParam和IParam變量的含義與其在按鈕控件中的含義一致:

LOWORD (wParam)???? 子窗口 ID

HIWORD (wParam)????? 通知碼

IParam??? 子窗口句柄

通知碼如下所示:??????

EN_SETFOCUS????? 編輯控件得到了輸入焦點

ENJ_KILLFOCUS??? 編輯控件失去了輸入焦點

EN_CHANGE? ?????? 編輯控件的內容將變化

EN_UPDATE?? ?????? 編輯控件的內容已變化

EN_ERRSPACE?????? 編輯控件沒有空間了

EN_MAXTEXT ?????? 編輯控件沒有空間完成插入了

EN_HSCROLL ?????? 編輯控件水平滾動條被單擊了

EN_VSCROLL ?????? 編輯控件垂直滾動條被單擊了

使用編輯控件

如果在主窗口上使用了多個單行編輯控件,則需要利用窗口子類來將輸入焦點從一個 控件移到另一個控件。這可以通過攔截Tab和Shifl-Tab擊鍵來完成,就和COLORS 1程序 一樣。(另一個窗口子類的例子會在本章稍后的HEAD程序中討論* )如何處理回車鍵由你 自己決定。可以使用和處理Tab鍵相同的方式,或將其作為一個信號傳遞給程序,通知程 序所有的編輯框已經準備就緒。

如果要把文本插入編輯框,可以使用SetWindowText函數。從編輯控件中讀取文本涉 及調用GetWindowTextLength和GetWindowText。我們會在以后改進的POPPAD版本中看見一些這方面的實例。

傳遞給編輯控件的消息

可以使用SendMessage發送給編輯控件的消息,因為這些消息太多了,下面是一個概括的介紹。

●下面這些消息可以讓你剪切、復制或清除當前選擇的內容。用戶可以使用鼠標或Shift 鍵加光標鍵來選擇需要的文本,從而高亮顯示編輯控件中所選的文本:

SendMessage (hwndEdit, WM_CUT, 0, 0);

SendMessage (hwndEdit, WM_COPY, 0, 0) ;

SendMessage (hwndEdit, WM_CLEAR, 0, 0);

WM_CUT把當前選擇從編輯控件中移走并發送給剪貼板。WM_COPY把當前選擇從編輯 控件_中復制到剪貼板并保留在原地。WM_CLEAR把當前選擇從編輯控件中刪除并且不傳遞給剪貼板。

還可以把剪貼板上的文本插入到編輯控件的當前位置:

SendMessage (hwndEdit, WM_PASTE, 0, 0);

●可以用如下函數獲得當前選擇文本的初始位置和終止位置:

SendMessage (hwndEdit, EM_GETSEL, (WPARAM) &iStart, (LPARAM) &iEnd) ;

終止位置其實是你選擇的最后一個字符的位置加1。

●可以如下選擇文本:

SendMessage (hwndEdit, EM_SETSEL, iscart, iEnd);

也可以用其他文本取代當前選擇的文本:

SendMessage (hwndEdit, EM_REPLACESEL, 0, (LPARAM) szString);

●對于多行編輯器,可以如下得到編輯器的行數:

iCount = SendMessage (hwndEdit,EM_GETLINECOUNT, 0, 0);

●對于某一個指定的行,可以獲得從編輯緩沖區的起點到這行的位移量:

iOffset = SendMessage (hwndEdit, EM_LINEINDEX, iLine, 0) ;

行從0開始計數。如果傳入-1給iLine,可以返回插入符號所在行的位移量。如下可得到行的長度:

iLength = SendMessage (hwndEdit, EM_LINELENGTH, iLine, 0);

●可以用如下函數來復制某行到緩沖區:

iLength = SendMessage (hwndEdit, EM_GETLINE, iLine, (LPARAM) szBuffer);

8.4.2 第53練:編輯控件

/*------------------------------------------------------------------

053? WIN32 API 每日一練

???? 第53個例子POPPAD1.C:編輯控件

???? 創建編輯控件

???? WM_COMMAND消息處理

(c) www.bcdaren.com, 2020

----------------------------------------------------------------*/

#include <windows.h>

#define ID_EDIT 1

LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);

TCHAR szAppName[] = TEXT ("PopPad1") ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

?PSTR szCmdLine, int iCmdShow)

{

???? HWND hwnd;

??? (略)

???? return msg.wParam;

}

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam,LPARAM

lParam)

{

???? static HWND hwndEdit;

???? switch (message)

???? {

???? case WM_CREATE:

????????? hwndEdit = CreateWindow(TEXT("edit"),NULL,

?????????????? WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL |

?????????????? WS_BORDER | ES_LEFT | ES_MULTILINE |

?????????????? ES_AUTOHSCROLL | ES_AUTOVSCROLL,

?????????????? 0, 0, 0, 0, hwnd, (HMENU)ID_EDIT,

?????????????? ((LPCREATESTRUCT)lParam)->hInstance, NULL);

//輸入的最大文本量(TCHAR)默認大小32,767 個字符(包括空字符)

??????? ? SendMessage(hwndEdit,EM_SETLIMITTEXT,0,1);

????????? return 0;

???? case WM_SETFOCUS:

????????? SetFocus(hwndEdit);//設為焦點

????????? return 0;

???? case WM_SIZE:

//重新繪制編輯框

????????? MoveWindow(hwndEdit,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);

????????? return 0;

???? case WM_COMMAND:

????????? if (LOWORD(wParam) == ID_EDIT)

????????? {//編輯控件中輸入的文本量的默認限制為32,767 個字符(包括空字符)。

//應用程序可以通過發送 _ SETLIMITTEXT 消息的控件來更改默認限制。

?????????????? if (HIWORD(wParam) == EN_ERRSPACE || HIWORD(wParam)

== EN_MAXTEXT)//已滿

?????????????? {

??????????????????? MessageBox(hwnd,TEXT("Edit control out of space."),

??????????????????? szAppName,MB_OK | MB_ICONSTOP);

?????????????? }

????????? }

????????? return 0;

???? case WM_DESTROY:

????????? PostQuitMessage(0);

????????? return 0;

???? }

???? return DefWindowProc(hwnd, message, wParam, lParam);

}

/******************************************************************************

創建編輯控件

hwndEdit = CreateWindow(TEXT("edit"), NULL,

???? WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |

???? WS_BORDER | ES_LEFT | ES_MULTILINE |

???? ES_AUTOHSCROLL | ES_AUTOVSCROLL,

???? 0, 0, 0, 0, hwnd, (HMENU)ID_EDIT,

???? ((LPCREATESTRUCT)lParam)->hInstance, NULL);

窗口樣式是WS_CHILD,外加幾個選項。和在靜態子窗口控件中一樣,

編輯控件中的文本也可以左對齊、右對齊或居中。

這些格式可以通過ES_LEFT, ES_RIGHT或ES_CENTER窗口樣式來指定。

ES_MULTILINE:創建一個多行編輯控件

ES_AUTOHSCROLL:自動水平滾動

ES_AUTOVSCROLL:自動垂直滾動

*******************************************************************************

WM_COMMAND消息處理

//字符已滿情形的處理

if (LOWORD(wParam) == ID_EDIT)

? ?if (HIWORD(wParam) == EN_ERRSPACE || HIWORD(wParam) == EN_MAXTEXT)//空間不足

????????? MessageBox(hwnd, TEXT("Edit control out of space."),

?????????????? szAppName, MB_OK | MB_ICONSTOP);

*/

?????? 運行結果:

圖8-6 編輯控件

?

總結

?????? 實例POPPAD1.C非常簡單。窗口過程處理WM_CREATE消息時,創建一個”edit”控件,窗口樣式為WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL。接著調用SendMessage向編輯控件發送一個EM_SETLIMITTEXT消息,設置編輯控件輸入最大字符數為默認值32767個字符。

?????? WM_SETFOCUS消息:調用SetFocus函數將焦點交給編輯控件。

?????? WM_SIZE消息:調整編輯控件大小。

?????? WM_COMMAND消息:WM_COMMAND消息參數wParam低字為控件ID,高字為控件通知碼。如果通知碼為EN_ERRSPACE 或 EN_MAXTEXT時,表示空間不足或者超出最大輸入字符數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41139.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41139.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41139.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【文獻解析】Voxelmap——一種自適應體素地圖

Efficient and Probabilistic Adaptive Voxel Mapping for Accurate Online LiDAR Odometry 論文地址&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9813516 代碼&#xff1a;GitHub - hku-mars/VoxelMap: [RA-L 2022] An efficient and probabili…

制冷軟件SOLKANE單級制冷循環計算

SOLKANE軟件下載 單級制冷循環參數介紹 輸入數據&#xff1a; 1.蒸發器&#xff1a; 溫度&#xff1a;蒸發溫度t6&#xff08;露點溫度&#xff09;。 過熱&#xff1a;制冷劑t6-t6在蒸發器中過熱。 壓力損失&#xff1a;蒸發器入口和出口之間的壓力下降。 制冷量&#x…

Android12 MultiMedia框架之MediaExtractorService

上節學到setDataSource()時會創建各種Source&#xff0c;source用來讀取音視頻源文件&#xff0c;讀取到之后需要demux出音、視頻、字幕數據流&#xff0c;然后再送去解碼。那么負責進行demux功能的media extractor模塊是在什么時候階段創建的&#xff1f;這里暫時不考慮APP創建…

深圳晶彩智能ESP32-2432S028R實時觀察LVGL9效果

深圳晶彩智能ESP32-2432S028R概述&#xff1a; 深圳晶彩智能出品ESP32-32432S028R為2.8寸彩色屏采用分辨率320x240彩色液晶屏&#xff0c;驅動芯片是ILI9431。板載樂鑫公司出品ESP-WROOM-32&#xff0c;Flash 4M。型號尾部“R”標識電阻膜的感壓式觸摸屏&#xff0c;驅動芯片是…

基于MATLAB對線陣天線進行泰勒加權

相控陣天線——基于MATLAB對線陣進行泰勒加權 目錄 前言 一、泰勒綜合 二、單元間距的改變對泰勒陣列方向圖的影響 三、單元數的改變對泰勒陣列激勵分布的影響 四、副瓣電平SLL對泰勒陣列激勵幅度的影響 五、副瓣電平SLL對泰勒陣列方向圖的影響 六、泰勒陣列和切比雪夫陣…

量化交易在不同經濟周期中的表現

量化交易&#xff0c;作為一種基于算法和數學模型的交易方法&#xff0c;其在不同經濟周期中的表現受到了市場參與者的廣泛關注。量化交易策略的設計使其能夠在多種市場環境中尋找投資機會&#xff0c;無論是經濟擴張期還是衰退期&#xff0c;都能夠展現出其獨特的適應性和效率…

7.6數據結構作業

// 練習一 struct K { double a; //8 char b; //1 char c; //1 double d; //8 };//24 // 練習二 struct L { int a; //4 double b; //8 char c; //1 };//24 // 練習三 struct M { char a;//1 int b; //4 char c; //1 double d; //8 };//24 /…

(5) 深入探索Python-Pandas庫的核心數據結構:Series詳解

目錄 前言1. Series 簡介2. Series的特點3. Series的創建3.1 使用列表創建Series3.2 使用字典創建Series3.3 使用列表和自定義索引創建Series3.4 指定數據類型和名稱 4. Series的索引/切片4.1 下標索引&#xff1a;基于整數位置的索引4.2 基于標簽的索引4.3 切片4.4 使用.loc[]…

觸感網絡:WebKit 振動(Vibration API)的交互新維度

觸感網絡&#xff1a;WebKit 振動&#xff08;Vibration API&#xff09;的交互新維度 在數字化時代&#xff0c;用戶體驗的追求已經不僅限于視覺和聽覺&#xff0c;觸覺反饋也逐漸成為網頁交互設計的重要組成部分。WebKit 作為眾多現代瀏覽器的核心技術引擎&#xff0c;對振動…

Linux 文件描述符 fd

當然&#xff0c;以下是一些關于 Linux 文件描述符&#xff08;fd&#xff09;的示例&#xff0c;以清晰、分點表示和歸納的形式給出&#xff1a; 1. 文件描述符的基本概念和用途 定義&#xff1a;文件描述符是一個非負整數&#xff0c;用于指代被進程所打開或使用的文件、套…

Leetcode 59. 螺旋打印矩陣

題目描述 給你一個正整數 n &#xff0c;生成一個包含 1 到 n2 所有元素&#xff0c;且元素按順時針順序螺旋排列的 n x n 正方形矩陣 matrix 。 示例 1&#xff1a; 輸入&#xff1a;n 3 輸出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]] 示例 2&#xff1a; 輸入&#xff1a;n…

c++中new和delete重載的一點介紹

通義千問中作答的&#xff0c;感覺回答的比自己總結的好&#xff1a; 實際上&#xff0c;你可以在C中重載new和delete運算符。重載new和delete允許你自定義內存分配和釋放的行為&#xff0c;這對于實現特殊的內存管理策略非常有用&#xff0c;例如&#xff1a; 內存池&#xf…

系統遷移從CentOS7.9到Rocky8.9

我有兩臺阿里云上的服務器是CentOS7.9&#xff0c;由于CentOS7已經停止支持&#xff0c;后續使用的話會有安全漏洞&#xff0c;所以需要盡快遷移&#xff0c;個人使用的話目前兼容性好的還是RockyLinux8&#xff0c;很多腳本改改就能用了。 一、盤點系統和遷移應用 查看當前系…

AI在軟件開發中的革新與未來挑戰

目錄 前言 AI工具的廣泛應用與優勢 AI與開發者技能需求的互動關系 AI的未來展望與面臨的挑戰 結語 前言 在當今快速發展的技術領域中&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;正以前所未有的方式改變著軟件開發的面貌。從代碼生成到錯誤檢測&#xff0c;再…

linux內核源碼學習所需基礎

1.面向對象的思想&#xff0c;尤其是oopc的實現方式。 2.設計模式。 這兩點需要內核源碼學習者不僅要會c和匯編&#xff0c;還要接觸一門面向對象的語言&#xff0c;比如c&#xff0b;&#xff0b;/java/python等等任意一門都行&#xff0c;起碼要了解面向對象的思想。 另外li…

MyBatis 框架核心及面試知識要點

1、什么是 MyBatis? MyBatis 是一款優秀的支持自定義 SQL 查詢、存儲過程和高級映射的持久層框架&#xff0c;消除了 幾乎所有的 JDBC 代碼和參數的手動設置以及結果集的檢索 。 MyBatis 可以使用 XML,或注解進 行配置和映射&#xff0c;MyBatis 通過將參數映射到配置的 SOL,形…

FastSpeech2中文語音合成就步解析:TTS數據訓練實戰篇

參考github網址&#xff1a; GitHub - roedoejet/FastSpeech2: An implementation of Microsoft’s “FastSpeech 2: Fast and High-Quality End-to-End Text to Speech” 數據訓練所用python 命令&#xff1a; python3 train.py -p config/AISHELL3/preprocess.yaml -m confi…

ida動態調試-cnblog

ida動態調試 傳遞啟動ida服務 android_server在ida\dbgsrv目錄中 adb push android_server /data/local/tmp/chmod 755 /data/local/tmp/android_server /data/local/tmp/android_serveradb forward tcp:23946 tcp:23946ida報錯:大多是手機端口被占用 報錯提示&#xff1a; …

java面試-java基礎(下)

文章目錄 一、和equals區別&#xff1f;二、hashcode方法作用&#xff1f;兩個對象的hashCode方法相同&#xff0c;則equals方法也一定為true嗎&#xff1f;三、為什么重寫equals方法就一定要重寫hashCode方法&#xff1f;四、Java中的參數傳遞時傳值呢還是傳引用&#xff1f;五…

期末上分站——計組(3)

復習題21-42 21、指令周期是指__C_。 A. CPU從主存取出一條指令的時間 B. CPU執行一條指令的時間 C. CPU從主存取出一條指令的時間加上執行這條指令的時間。 D. 時鐘周期時間 22、微型機系統中外設通過適配器與主板的系統總線相連接&#xff0c;其功能是__D_。 A. 數據緩沖和…