2

私は Windows プログラミングの初心者であり、さまざまな種類の問題に継続的に遭遇していますが、そのほとんどは自分で解決できました。

当面の問題は、テキスト領域に表示されるキャレット (またはカーソル) です。テキストを入力している場所を示すもの? 少なくとも表示されていますが、本来のように点滅しません。

次のように WM_CREATE で作成された編集ボックスがあります。

    case WM_CREATE:
        {

            if(!logged) {

                    HWND userField = CreateWindow(
                                        "EDIT",  // Predefined class; Unicode assumed 
                                        NULL,      // Button text 
                                        WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,  // Styles 
                                        C_WIDTH/2 - 80,         // x position 
                                        C_HEIGHT - 240,         // y position 
                                        160,        // Button width
                                        25,        // Button height
                                        hwnd,     // Parent window
                                        NULL,       // No menu.
                                        (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), 
                                        NULL);      // Pointer not needed.

                    // initialize NONCLIENTMETRICS structure
                    NONCLIENTMETRICS ncm;
                    ncm.cbSize = sizeof(ncm);

                    // obtain non-client metrics
                    SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0);

                    // create the new font
                    HFONT hNewFont = CreateFontIndirect(&ncm.lfMessageFont);

                    // set the new font
                    SendMessage(userField, WM_SETFONT, (WPARAM)hNewFont, 0);

            }

        }
        break;

エディットボックスに関するコードは以上です。私が十分に明確でないか、コードの提供が不足している場合は申し訳ありません。ここでコードのどの部分が関連していて、何が関連していないのかわかりません。コード全体をここに貼り付ける必要もないと思います。

問題は、テキスト ボックス (userField) のキャレットが点滅しないことです。

必要な場合は、詳細をお尋ねください。

4

3 に答える 3

4

あなたのコードを使用すると、キャレットが点滅しませんでした。しかし、私は追加しました:

SetFocus( userField );

そしてほら、点滅するキャレット:-)

于 2013-11-04T12:06:45.850 に答える
2

これはOPが経験していた問題ではないかもしれませんが、私は同じ症状を経験していました。他の誰かがこの問題を経験した場合に備えて、ここに私の解決策を投稿しています...

つまり、エディット コントロールをサブクラス化し、WM_SETFOCUS イベントを処理する場合、DefSubclassProc() を呼び出す必要があります。そうしないと、キャレットが表示されません。おそらく、ShowCaret() を自分で呼び出すことができますが、他に処理が必要な場合に備えて、DefSubclassProc() を呼び出す方がおそらく安全です。

于 2015-05-07T17:46:29.393 に答える
1

遊んだ後、コードを少し整理したりした後、誤って自分でこれを解決しました

私が変更され

HWND userField = CreateWindow(
                             "EDIT",  // Predefined class; Unicode assumed 
                             NULL,      // Button text 
                             WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,  // Styles 
                             C_WIDTH/2 - 80,         // x position 
                             C_HEIGHT - 240,         // y position 
                             160,        // Button width
                             25,        // Button height
                             hwnd,     // Parent window
                             NULL,       // No menu.
                             (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), 
                             NULL);      // Pointer not needed.

の中へ

HWND userField = CreateWindow("EDIT", NULL, WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
                     C_WIDTH/2 - 80, C_HEIGHT - 240, 160, 25, hwnd, NULL, g_hInstance, NULL);

唯一の違いは hInstance です。最初のコードでは明らかに間違っていました。これを hInstance のグローバル参照に変更しました。

于 2013-11-04T13:22:26.323 に答える