簡體   English   中英

沒有對話框的編輯控件上的SHAutoComplete

[英]SHAutoComplete on edit control without dialog boxes

我在使用SHAutoComplete函數時遇到問題。 當我在父窗口不是對話框的編輯框中使用它時,它無法正常工作。

自動完成功能似乎工作正常,但下拉列表與基於編輯框中鍵入的內容的可能候選項的呈現非常混亂。 基本上只顯示下拉菜單的邊框。 邊框的寬度足以滿足可能的建議,但建議本身從未被繪制。 即使是下拉列表背景顏色也是錯誤的。 就好像它從未被繪制過並保持原始父窗口顏色。

如果建議的數量足夠大,因此下拉列表需要滾動條,滾動條也無法正確呈現 - 箭頭不會被繪制。

在這兩種情況下,無論是否有滾動條,下拉列表都不接受鼠標輸入,即我無法點擊這些項目。 如果我在顯示下拉菜單時按下鍵盤上的“向下”鍵,它會按預期工作。 在第二次或第三次按下后,項目最終開始出現。 但滾動條仍然無法正確呈現。

如果不是注冊我自己的Windows類,我只需使用帶有::DialogBoxParam()的對話框,然后一切按預期進行。 自動完成工作完全沒有任何問題。

這就是我在做的事情。 此代碼將注冊一個窗口類,創建主窗口,創建一個編輯框,然后在其上調用SHAutoComplete 它必須與Shlwapi.lib鏈接

// this code must be linked with Shlwapi.lib

#include <Windows.h>
#include <Shlwapi.h>


// name of the class that will be created for the main window
static const char WindowClassName[] = "SHAutoCompleteDoesNotWorkWithoutADialogWindowClassName";


// the main window procedure
static LRESULT CALLBACK WindowProc(
    HWND   hwnd,
    UINT   uMsg,
    WPARAM wParam,
    LPARAM lParam)
{
    switch(uMsg)
    {   
        case WM_CREATE:
        {
            HWND hwndEdit = ::CreateWindowEx(
                0,
                "EDIT",
                0,
                WS_CHILD | WS_VISIBLE,
                10, 
                10, 
                300,
                25,
                hwnd, 
                NULL,
                NULL,
                0);     

            ::SHAutoComplete(hwndEdit, SHACF_DEFAULT);

            return 0;
        }            

        case WM_DESTROY:
            ::PostQuitMessage(1);
            return 0;

        default:
            return ::DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
}


// the app entry point
int CALLBACK WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR    lpCmdLine,
    int       nCmdShow)
{
    ::CoInitialize(NULL);

    WNDCLASSEX wcex    = {0};
    wcex.cbSize        = sizeof(wcex);
    wcex.style         = CS_OWNDC | CS_HREDRAW | CS_VREDRAW ;
    wcex.lpfnWndProc   = WindowProc;
    wcex.hInstance     = hInstance;        
    wcex.lpszClassName = WindowClassName;
    wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); 

    ATOM atom = ::RegisterClassEx(&wcex);

    HWND hwnd = ::CreateWindowEx(
        0,
        MAKEINTATOM(atom),
        "SHAutoComplete Test",
        WS_OVERLAPPEDWINDOW | WS_VISIBLE |  WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        hInstance,
        NULL);

    MSG msg;
    while(::GetMessage(&msg, hwnd, 0, 0) > 0)
    {
        ::TranslateMessage(&msg);
        ::DispatchMessage(&msg);
    }

    ::UnregisterClass((LPCTSTR)atom, NULL);

    ::CoUninitialize();

    return 0;
}       

該代碼產生以下內容:

  1. 需要滾動條時的下拉菜單http://www.abload.de/img/shautocomplete_2i1sk4.jpg

  2. 幾次按下“向下”鍵后的下拉菜單。 請注意滾動條仍然無法正確呈現。 http://www.abload.de/img/shautocomplete_3efsgw.jpg

現在,當我切換到對話框時,就像一個魅力。 在下面的代碼中,IDD_DIALOG1只是一個空的對話框資源,由IDE自動創建。

這是rc文件的相關部分

IDD_DIALOG1 DIALOGEX 0, 0, 316, 185
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
END

以下是使用它的代碼

// this code must be linked with Shlwapi.lib

#include <windows.h>
#include <Shlwapi.h>

#include "Resource.h"


BOOL CALLBACK DialogProc(
    HWND   hwnd,
    UINT   uMsg,
    WPARAM wParam,
    LPARAM lParam)
{    

    switch(uMsg)
    {        
        case WM_INITDIALOG:
        {
            HWND hwndEdit = ::CreateWindowEx(
                0,
                "EDIT",
                0,
                WS_VISIBLE | WS_CHILD,                    
                0, 
                0, 
                300,
                20,
                hwnd, 
                NULL,
                NULL,
                0);      

            ::SHAutoComplete(hwndEdit, SHACF_DEFAULT);

            return 1;
        }


        case WM_CLOSE:            
            ::EndDialog(hwnd, 0);
            return 1;   


        default:
            return 0;
    }
}



int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR     lpCmdLine,
    int       nShowCmd)
{       
    ::CoInitialize(NULL);

    ::DialogBoxParam(
        NULL,
        MAKEINTRESOURCE(IDD_DIALOG1),
        NULL,
        DialogProc,
        0);    

    ::CoUninitialize();

    return 0;
}

你能指出我哪里出錯嗎? 據我所知,除了主窗口的創建和破壞之外,兩者之間似乎沒有任何區別。 我在SHAutoComplete文檔中遺漏了一些內容,表明它只能在對話框中的編輯框中使用嗎?

您正在使用篩選的消息循環,因此不會處理下拉列表的任何消息。 將NULL作為GetMessage的第二個參數傳遞

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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