2012-12-15 49 views
0

REVISION 1:WinAPI - 如何打印文本以編輯控件?

我無法抓住WinAPI的AllocConsole();函數。我或者需要選項一,或者選項2.儘管都有,但最好是:)。提前致謝。這裏是選項1:

單擊BUTTON_1時從WinAPI程序創建控制檯窗口。控制檯需要能夠輸出文本(如cout),並且可以打印睡眠/延遲文本。 (喜歡的東西Sleep()

選項2:

除了打印文本到控制檯窗口的像在選項1中,程序打印文本到用戶不可訪問的編輯框。這也需要能夠使用諸如Sleep()之類的東西來延遲文本被打印。

+0

你的意思是替換它,就像使用'SetWindowText'或'WM_SETTEXT'? – chris

+2

SetWindowText()。這是非常基本的,如果你想要使用原生的winapi編程,你需要閱讀Petzold的Programming Windows。 –

回答

0

假設你追加字符串編輯控件,也許是爲了記錄一些漫長的過程TTY式輸出:

使用EM_SETSEL消息就在最後一個字符之後選擇範圍,然後使用EM_REPLACESEL更換它用字符串來追加。發生這種情況時,編輯控件會滾動。例如,如果hEdit是編輯控件的句柄,str 0結尾的字符串追加:

int idx=GetWindowTextLength(hEdit); 
SendMessage(hEdit,EM_SETSEL,idx,idx); 

SendMessage(hEdit,EM_REPLACESEL,0,(LPARAM)str); 

這是本知識庫文章所建議的過程:http://support.microsoft.com/kb/109550

+0

如果我需要使用像Sleep()這樣的函數,該怎麼辦?暫時放慢字符串寫入編輯框的速度? – hCon

+0

我不認爲你需要爲編輯框的緣故做到這一點,但如果因爲其他原因需要這樣做,那麼你可以。 (不保證列表框會被更新,但是,如果帶有消息循環的線程正在睡眠而不是泵送消息。) –

0

我的建議是使用

SendMessage(hEditBox,EM_SETSEL,-2,-2); 

將光標移動到編輯控件中文本的末尾。它爲您節省了一個函數調用並且它可以工作。

關於睡眠相關部分,我認爲使用定時器會更好,應該沒有任何問題。

Ex。

// somewhere in the code where you decide to make changes to the edit control 
... 
SetTimer(hWnd,TIMER_ID,1000,0); // TIMER_ID is arbitrary, the delay is set to 1000 ms 
... 

// main procedure message 
switch (uMsg) { 
    ... 
    case WM_TIMER: 
     SendMessage(hEditBox,EM_SETSEL,-2,-2); 
     SendMessage(hEditBox,EM_REPLACESEL,0,buffer); 
     KillTimer(hWnds,TIMER_ID); 
    ... 
} 

您可能希望把更多的工作到這一點,比如重用的SetTimer呼叫。

+0

-2對我來說是新的!這在哪裏記錄? –

+0

更新了問題以更好地適合我的實際問題。上面的代碼對我不起作用,因爲我不知道如何定義'buffer'。我知道這是一個'int',但我不知道它是否需要一個特定的數字。 – hCon

+0

@TomSeddon它沒有記錄,我試過了,它工作。如果將0FFFFFFFFh(-1)視爲-1,則不會選擇任何內容。如果您放入0FFFFFFFEh(-2),它似乎被視爲插入位置4294967294,最終將插入符號置於編輯框文本的末尾。 – mkey