video sam šta si pravio u onome što si poslao i koliko sam video, sve je manje više u redu
rešenje za tvoj problem je Subclassing ( podklasovanje ), zamena originalne procedure prozora sa nekom sopstvenom:
e sad, koliko sam video treba ti za EDIT kontrolu, pa ću ovde da navedem za nju, ali opšti princip i dalje važi za ostale, s time što za neke kontrola treba pogledati i dokumentaciju - npr. COMBOBOX u zavisnosti od stila, šalje WM_KEYDOWN poruku svojoj listi koja je njen podređeni prozor ( CBS_DROPDOWNLIST ), a u ostalim slučajevima ( CBS_DROPDOWN i CBS_SIMPLE ) svojoj podređenoj edit kontroli, tako da treba u stvari podklasovati odgovarajuću podređenu kontrolu
evo kako to izgleda :
po pozivu funkcije CreateWindowEx za prozor (hEditWnd ) koji se želi podklasovati, potrebno je pozvati funkciju SetWindowLong na sledeći način :
Code:
OldWndProc = (WNDPROC)SetWindowLong(hEditWnd, GWL_WNDPROC, (LONG)NewWndProc);
gde je OldWndProc promenljiva tipa WNDPROC, a NewWndProc :
Code:
// ovde je stavljeno da se pri pritisku na ENTER menja fokus kontrole
LRESULT CALLBACK NewWndProc(HWND hEditWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
if (Msg == WM_KEYDOWN)
if ((int)wParam == VK_ENTER)
{
SetFocus(hNaredniEditWnd);
return 0;
}
return CallWndProc(OldWndProc, hEditWnd, Msg, wParam, lParam);
}
...
// i pre poziva DestroyWindow za podklasovani prozor :
SetWindowLong(hEditWnd, GWL_WNDPROC, (LONG)OldWndProc);
DestroyWindow(hEditWnd);
Dakle, u suštini ti samo presrećeš poruke upućene ovom prozoru i šalješ i na defaultno procesiranje u OldWndProc pozivom CallWndProc.
Na ovaj način se bilo koji prozor može podklasovati.
[Ovu poruku je menjao stargazer dana 18.03.2006. u 23:18 GMT+1]