WTL терезесі/пішіні шексіз хабарлар циклі кейін бұзылады

Менде WTL/VC ++-де қателерді түзету қажет жобаның жобасы бар. Мәселелердің бірі - Ctrl + X немесе Ctrl + Z пернелерін пайдаланғаннан кейін негізгі терезенің құлауы (әрине, бүкіл қолданба). Бұл кілттерге тағайындалған реттелмелі жеделдеткіштерім жоқ.  Мен «өлімге әкелетін» пернелер тіркесімінің шексіз хабарлар циклын тудыратынын анықтадым

uMsg == 273 (0x00000111)

ақыр соңында стека толып кету қателігімен құлады:

 Command Code: 5, ID: 29892, HANDLE:  0xe091aFirst-chance exception at 0x007f88fa 
 in .exe: 0xC00000FD: Stack overflow.
 Unhandled exception at 0x007f88fa in .exe: 0xC00000FD: Stack overflow.

Мен оны хабарламаларды өңдеу функциясында оңай қоямын -

BEGIN_MSG_MAP (CMDIChildWindowImpl)

    MESSAGE_HANDLER(WM_CREATE, OnCreate)
    MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    MESSAGE_HANDLER(WM_CLOSE, OnClose)
    MESSAGE_HANDLER(WM_TIMER, OnTimer)

* *

    COMMAND_ID_HANDLER(ID_FILE_NEW, OnNewDownload)
    COMMAND_ID_HANDLER(ID_UPLOAD_FOLDER_SET, OnUploadFolderSet)
    COMMAND_ID_HANDLER(ID_OPEN_RECORD_BY_ID, OnOpenOnline)

* *

    NOTIFY_CODE_HANDLER(HLN_PORTAL_RECORD_DOWNLOAD, OnPortalPageNotify);
    NOTIFY_CODE_HANDLER(HLN_SELCHANGED, OnWebFormNotify);
    if(uMsg == 273)
     return false;
    else
     CHAIN_MSG_MAP(baseClass)

END_MSG_MAP ()

Бірақ бұл топтамаға қанағаттанбадым, не болып жатқанын жақсы білуіме болады - және мен бұл пернелердің Windows әдепкі параметрлерін өзімде жасағанын қалаймын, «cut» және «undo»

өлімге қатысты хабарламалар туралы қосымша ақпарат:

Ctrl + X -

uMsg 273 белгісіз int

wParam 123171 белгісіз int

lParam 0 ұзын

lParam 0 ұзын

Ctrl + Z -

uMsg 273 белгісіз int

wParam 123179 белгісіз int

lParam 0 ұзын

Кешіріңіз, егер бұл мағынасы болмаса, менің VC ++ кунг-фо ржастылықты білдіреді; Егер кез-келген адам идеяларды іздестіруге кеңес берсе, бұл өте жоғары бағаланады.

Рақмет сізге!

O.

0
273 - бұл WM_COMMAND . Жоғарыда келтірілген код үзінділері дәл дұрыс емес істеп жатқанымен көрсетілмейді.
қосылды автор Roman R., көзі
WM_COMMAND үшін COMMAND_ID_HANDLER немесе COMMAND_HANDLER немесе кез келген өңдеуші хабарламаны өңдейді және ол жерде өңдеуді тоқтатады. Мүмкін сізде бұл өңдегіш бірдей хабарламаны жасайтын және ол толығымен жинауға дейін орындайтын кейбір әрекеттерді бастайды. Демек, өңдеуші маңызды. Сондай-ақ сізде егжей-тегжейлі қоңырау стакасы бар.
қосылды автор Roman R., көзі
Әлі де естілмейтін нәрсе. Айтпақшы, сізде өңдегіш сызығы қажет емес, оның орнына дөңгелек сілтемесін аяқтау үшін дұрыс емес орналастырылған бағыттау сызығын іздеңіз.
қосылды автор Roman R., көзі
Мен WM_COMMAND деп отырмын - сондықтан мен wParams-ге қарсы басқа да мәзірлерді/үдеткіштерді сүзуге емес, сонымен қатар, мен де сақ болу керек. Рахмет, кодының не екенін анықтауда мен көп табанды болуым керек еді. Менің ойымша, ол айналаға айналады, өйткені ол «базалық сыныптарда» өңделмей, «балаға» қайта жіберіледі. Кодқа байланысты - мен мұнда неге көмектесетінін білмеймін. Романға тағы да рахмет!
қосылды автор Oleg Ivanov, көзі
Ғажайып! WM_COMMAND үшін осы терезеде/сыныпта немесе оның базасында MESSAGE_HANDLER болмады және шексіз циклды тудырған тізбекті шақыру/қайта бағыттау хабары болды. Көмегіңіз үшін рақмет!
қосылды автор Oleg Ivanov, көзі
дәл! line CHAIN_MSG_MAP (baseClass) хабарламаны WM_COMMAND үшін өңдегіші жоқ негізгі классқа жібереді, бірақ ол не істеді - келесі :: SendMessage (m_hWndActive, uMsg, wParam) жасаған макросты CHAIN_ACTIVETABVIEW_COMMANDS , lParam) , яғни хабарды белсенді терезеге қайтарады, онда барлық басталды - демек шексіз цикл
қосылды автор Oleg Ivanov, көзі

1 жауаптар

@Roman R. арқасында, осы терезеде WM_COMMAND хабары үшін ешқандай өңдеуші жоқ, және оның базалық сыныптарының бірінде хабарды белсенді терезеге қайта жіберу арқылы шексіз цикл жасайтын функция болды . Сондықтан мен осы жұмысшыға қосылдым -

        if(uMsg == WM_COMMAND)
          return DefWindowProc(WM_COMMAND, wParam, lParam);

бұл мен үшін жақсы шешім сияқты көрінеді.

Рахмет!

0
қосылды