Не ставит фокус

Раздел посвящен программированию с использованием Power Basic.
SLUTER
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.06.2010 (Вс) 18:26

Не ставит фокус

Сообщение SLUTER » 12.08.2010 (Чт) 16:22

например есть вот такой код. после завершения очень сложного цикла не могу поставить фокус ни на один контрол. он тупо исчезает, через TAB тоже не канает. жмем ОЛОЛО, ждём, пока контролы станут активными, жмём TAB - и облом. в чём проблема?

Код: Выделить всё
#COMPILER PBWIN 9
#COMPILE EXE
#DIM ALL


GLOBAL hDlg AS DWORD
GLOBAL hThread AS DWORD


FUNCTION PBMAIN () AS LONG
    DIALOG NEW 0, "Трололо",,, 156, 118, %DS_CENTER OR %WS_CAPTION OR %WS_SYSMENU OR %WS_MINIMIZEBOX, 0  TO hDlg
    CONTROL ADD TEXTBOX, hDlg, 100, "пиу пиу пиу пиу", 16, 24, 124, 13, %WS_CHILD OR %ES_AUTOHSCROLL OR %WS_TABSTOP, %WS_EX_CLIENTEDGE
    CONTROL ADD BUTTON, hDlg, 1, "ОЛОЛО", 16, 90, 55, 15, %BS_PUSHBUTTON OR %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP
    CONTROL ADD BUTTON, hDlg, 2, "ЖЪРЧИК", 85, 90, 55, 15, %BS_PUSHBUTTON OR %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP
    DIALOG SHOW MODAL hDlg, CALL WndProc
END FUNCTION



CALLBACK FUNCTION WndProc () AS LONG
    SELECT CASE CBMSG
        CASE %WM_COMMAND
            SELECT CASE CBCTL

                CASE 1
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                        CONTROL DISABLE hDlg, 1
                        CONTROL DISABLE hDlg, 2
                        CONTROL DISABLE hDlg, 100

                        THREAD CREATE mThread(hDlg) TO hThread

                    END IF

                CASE 2
                    DIALOG END CB.HNDL, 0

            END SELECT
    END SELECT
END FUNCTION




FUNCTION mThread(BYVAL hDlg AS DWORD) AS LONG
    LOCAL i AS LONG 'дщсфд ш фы дщтп е_ный пи_дец!!111111
   
    LOCAL hRes AS LONG

    FOR i = 0 TO 100000000
    ' пиу пиу пиу
    NEXT i


    CONTROL ENABLE hDlg, 1
    CONTROL ENABLE hDlg, 2
    CONTROL ENABLE hDlg, 100
   
    CONTROL SET FOCUS hDlg, 1 ' НЕ РАБОТАЕТ
    THREAD CLOSE hThread TO hRes
END FUNCTION

SLUTER
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.06.2010 (Вс) 18:26

Re: Не ставит фокус

Сообщение SLUTER » 12.08.2010 (Чт) 16:35

к стати, если свернуть-развернуть, либо переключиться на другое окно, а потом обратно на своё, то всё опять работает.

ну или если мышей кликнуть по какому-то контролу, но это понятно.

:|

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Re: Не ставит фокус

Сообщение jangle » 12.08.2010 (Чт) 16:45

SLUTER писал(а):например есть вот такой код. после завершения очень сложного цикла не могу поставить фокус ни на один контрол. он тупо исчезает, через TAB тоже не канает. жмем ОЛОЛО, ждём, пока контролы станут активными, жмём TAB - и облом. в чём проблема?


Из нити нельзя установить фокус в основном потоке. Кури SDK, например функцию : AttachThreadInput

SLUTER
Новичок
Новичок
 
Сообщения: 49
Зарегистрирован: 06.06.2010 (Вс) 18:26

Re: Не ставит фокус

Сообщение SLUTER » 12.08.2010 (Чт) 17:28

Не уверен, правильно ли я скурил, но методом научного тыка работает

Код: Выделить всё
#COMPILER PBWIN 9
#COMPILE EXE
#DIM ALL

#INCLUDE "WIN32API.INC"

GLOBAL hDlg AS DWORD
GLOBAL hThread, hThreadM AS DWORD


FUNCTION PBMAIN () AS LONG
    DIALOG NEW 0, "Трололо",,, 156, 118, %DS_CENTER OR %WS_CAPTION OR %WS_SYSMENU OR %WS_MINIMIZEBOX, 0  TO hDlg
    CONTROL ADD TEXTBOX, hDlg, 100, "пиу пиу пиу пиу", 16, 24, 124, 13, %WS_CHILD OR %ES_AUTOHSCROLL OR %WS_TABSTOP, %WS_EX_CLIENTEDGE
    CONTROL ADD BUTTON, hDlg, 1, "ОЛОЛО", 16, 90, 55, 15, %BS_PUSHBUTTON OR %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP
    CONTROL ADD BUTTON, hDlg, 2, "ЖЪРЧИК", 85, 90, 55, 15, %BS_PUSHBUTTON OR %WS_CHILD OR %WS_VISIBLE OR %WS_TABSTOP
    DIALOG SHOW MODAL hDlg, CALL WndProc
END FUNCTION



CALLBACK FUNCTION WndProc () AS LONG
    SELECT CASE CBMSG
        CASE %WM_COMMAND
            SELECT CASE CBCTL

                CASE 1
                    IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                        CONTROL DISABLE hDlg, 1
                        CONTROL DISABLE hDlg, 2
                        CONTROL DISABLE hDlg, 100

                        THREAD CREATE mThread(hDlg) TO hThread

                    END IF

                CASE 2
                    DIALOG END CB.HNDL, 0

            END SELECT
    END SELECT
END FUNCTION




FUNCTION mThread(BYVAL hDlg AS DWORD) AS LONG
    LOCAL i AS LONG 'дщсфд ш фы дщтп е_ный пи_дец!!111111

    LOCAL hRes AS LONG

    LOCAL idAttach, idAttachTo AS DWORD


    idAttachTo = GetCurrentThreadID()
    idAttach = GetWindowThreadProcessID(GetForeGroundWindow, 0)


    AttachThreadInput idAttach, idAttachTo, 1


    FOR i = 0 TO 100000000
    ' пиу пиу пиу
    NEXT i


    CONTROL ENABLE hDlg, 1
    CONTROL ENABLE hDlg, 2
    CONTROL ENABLE hDlg, 100

    CONTROL SET FOCUS hDlg, 1
   
    AttachThreadInput idAttach, idAttachTo, 0
    THREAD CLOSE hThread TO hRes
END FUNCTION


Вернуться в Power Basic

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5

    TopList