2013-11-04 147 views
2

我是windows編程的新手,並且不斷遇到各種各樣的問題,其中大部分問題我都能夠自己解決。C++ win32編輯框光標不閃爍

我手邊的問題是文本區域中顯示的插入符(或光標)。指示你在哪裏輸入文字的東西?那麼它至少表現出來,但它不會像應該那樣閃爍。

我在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)中的插入符不閃爍。

如果您需要它們,請詢問更多詳情。

+2

Unicode不應該假設爲btw,這種代碼寫入的方式很可能是調用'CreateWindowA'例如ANSI版本。 Unicode版本將'LPCWSTR'作爲第一個參數,傳遞一個'LPCSTR'。我會**高度**建議確保您將字符集設置爲Unicode,如果您使用的是VS,或者如果不是,則定義「UNICODE」和「_UNICODE」。 – Mgetz

+0

哦,原來就是這樣。我從VS2012升級到VS2013,突然我所有的L字符串都出錯了,我不得不將它改成隻字符串。我將UNICODE和_UNICODE都添加到我的預處理器定義中,一切都恢復正常。 –

+0

你應該不需要手動執行該操作,你應該檢查你可能設置爲MBCS的VC++項目設置 – Mgetz

回答

4

使用你的代碼,我沒有得到一個閃爍的插入符號。但後來我又說:

SetFocus(userField); 

就萬事大吉了,一個閃爍的插入符號:-)

+0

它對我沒有任何幫助。我在WM_CREATE結尾添加了 - 你把它放在哪裏? –

+0

在WM_CREATE末尾。 – manuell

0

玩耍之後 - 讓我的代碼有點整潔和東西 - 我無意中解決了這個對我自己

我改變

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。

+0

其他地方一定有別的東西。通過使用確切的CreateWindow代碼,我再現了您的問題(沒有焦點時沒有脫字符,也沒有* realy *問題...),並且只通過SetFocus添加了「固定」它。奇怪的。 – manuell

+0

哦。你一定誤解了這個問題。問題不在於沒有焦點(如你所說的,並非真正的問題......),但是當焦點集中時插入符號不會閃爍。當我說不眨眼時,我的意思是有一個插入符號 - 它只是不閃爍。 –

+0

對不起。我的答案根本就不相關。是「不閃爍」的插入符號? (使用箭頭鍵或鼠標時,ID會移動) – manuell

1

這可能不是OP中遇到的問題,但我遇到同樣的症狀,我在這裏發佈我的解決方案的情況下,別人的經驗這個問題...

總之,如果你子類編輯控件,並處理WM_SETFOCUS事件,您需要調用DefSubclassProc()或您的脫字符不會顯示。據推測,你可以自己調用ShowCaret(),但只要調用DefSubclassProc()就可以更安全,以防需要發生其他處理。