[英]Add negative values for CreateWindow macro in C++
我在Windows GUI Programming中使用CreateWindow API創建了文本框,如下所示,
CreateWindow( TEXT("EDIT"),
TEXT(""),
WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_DLGFRAME | ES_RIGHT,
x, y, w, h,
hwnd_,
(HMENU)0,
GetWindowInstance( hwnd_ ),
0 );
當我使用ES_NUMBER編輯控件樣式時,只允許將數字放入編輯控件。 但我不能把負值作為-123 。
有沒有辦法在編輯控件中僅支持負值內的整數? 任何人都可以幫助我嗎?
ES_NUMBER樣式應該更好地稱為ES_DIGITSONLY。 它只接受數字作為鍵盤輸入。
如果要使用接受數字和符號的Windows編輯控件,則必須將其子類化。 這意味着,您可以使用自己的窗口過程交換編輯控件的默認窗口過程。 您的窗口過程實現了編輯控件的新功能,其他任何內容都傳遞給編輯控件的默認窗口過程(而不是DefWindowProc()!)。
這是舊式C中的一個示例(因為您使用了Win32 API):
WNDPROC PreviousEditProc;
LRESULT CALLBACK EditSubclassProc( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam ) {
const TCHAR* ACCEPTED_CHARS = TEXT("0123456789+-");
TCHAR c;
switch( uMessage ) {
case WM_CHAR:
c = (TCHAR) wParam;
if( _tcschr( ACCEPTED_CHARS, c ) == nullptr )
return( 0 );
break;
}
return( CallWindowProc( PreviousEditProc, hWnd, uMessage, wParam, lParam ) );
}
編輯控件的子類,您必須更改為窗口過程並保存以前的過程:
HWND hEdit;
hEdit = CreateWindow( TEXT("EDIT"),
TEXT(""),
WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_DLGFRAME | ES_RIGHT,
x, y, w, h,
hwnd_,
(HMENU)0,
GetWindowInstance( hwnd_ ),
0 );
PreviousEditProc = (WNDPROC) SetWindowLong( hEdit, GWL_WNDPROC, (LPARAM) EditSubclassProc );
備注:
您可以使用上面的代碼對幾個編輯控件進行子類化,但是您不能使用相同的子類過程將編輯控件子類化兩次(PreviousEditProc將被其自身覆蓋)。
如果您在啟用Unicode或其他情況下編譯項目,則TCHAR類型為wchar_t。 您可能希望直接使用char或wchar_t。
字符串文字ACCEPTED_CHARS包含所有加速字符。 對於較長的列表,您可以使用isdigit(),ischar()等而不是_tcsstr()函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.