簡體   English   中英

在C ++中為CreateWindow宏添加負值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM