sekretarz11 Temat założony przez niniejszego użytkownika |
WinApi Okna dialogowe niemodalne - niepoprawne działanie. » 2021-06-10 14:52:51 Witam. Mam problem z programem i poprawnym działaniem dialogów niemodalnych. Chyba nie do końca zrozumiałem kurs na ten temat. Chciałem stworzyć aplikację która po naciśnięciu odpowiednich przycisków na dialogach niemodalnych wykona jakąś czynność. W moim przypadku po nacisnieciu 1, miał narysować kółko, a po 2,3,4 wyświetlić jakąś informację. Próbowałem już wielu kombinacji lecz dostaje albo błędy że "ret" nie jest int, tylko HWND, że CreateDialog nie może być int tylko HWND, albo że nie można przyrównać HWND z int i wiele innych. Lecz nie potrafię połączyć obsługi przycisków z wyświetlaniem np. tego kółka w programie głównym. Z góry dziękuję za pomoc. Stworzyłem plik: pasek.h #define IDD_PASEK 200 #define IDC_PRZYC1 201 #define IDC_PRZYC2 202 #define IDC_PRZYC3 203 #define IDC_PRZYC4 204
plik pasek.rc #include <windows.h> #include "pasek.h" IDD_PASEK DIALOGEX 0, 0, 98, 100 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION EXSTYLE WS_EX_TOOLWINDOW CAPTION "Pasek " FONT 8, "MS Sans Serif" { PUSHBUTTON "&1", IDC_PRZYC1, 7, 7, 84, 14 PUSHBUTTON "&2", IDC_PRZYC2, 7, 31, 84, 14 PUSHBUTTON "&3", IDC_PRZYC3, 7, 55, 84, 14 PUSHBUTTON "&4", IDC_PRZYC4, 7, 79, 84, 14 oraz plik main.cpp #if defined(UNICODE) && !defined(_UNICODE) #define _UNICODE #elif defined(_UNICODE) && !defined(UNICODE) #define UNICODE #endif #include <stdio.h> #include <tchar.h> #include <windows.h> #include "pasek.h"
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); BOOL CALLBACK DlgProc( HWND, UINT, WPARAM, LPARAM );
TCHAR szClassName[ ] = _T( "CodeBlocksWindowsApp" );
HWND hPasek, ret;
int WINAPI WinMain( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow ) { HWND hwnd; MSG messages; WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WndProc; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof( WNDCLASSEX ); wincl.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wincl.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); wincl.hCursor = LoadCursor( NULL, IDC_ARROW ); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground =( HBRUSH ) COLOR_BACKGROUND; if( !RegisterClassEx( & wincl ) ) return 0; hwnd = CreateWindowEx( 0, szClassName, _T( "Code::Blocks Template Windows App" ), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 800, HWND_DESKTOP, NULL, hThisInstance, NULL ); HWND hPrzyc = CreateWindowEx( 0, "BUTTON", "Menu", WS_CHILD | WS_VISIBLE, 10, 10, 760, 25, hwnd, NULL, hThisInstance, NULL ); ShowWindow( hwnd, nCmdShow ); while( GetMessage( & messages, NULL, 0, 0 ) ) { TranslateMessage( & messages ); DispatchMessage( & messages ); } return messages.wParam; }
void RysujKolo( HWND hwnd ) { HDC hdcOkno = GetDC( hwnd ); HBRUSH PedzelZiel, Pudelko; PedzelZiel = CreateSolidBrush( 0x00FF00 ); Pudelko =( HBRUSH ) SelectObject( hdcOkno, PedzelZiel ); Ellipse( hdcOkno, 10, 10, 510, 510 ); SelectObject( hdcOkno, Pudelko ); DeleteObject( PedzelZiel ); ReleaseDC( hwnd, hdcOkno ); }
int WINAPI WinDlg( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil ) { HWND hwnd; MSG msg; while( GetMessage( & msg, NULL, 0, 0 ) ) { if( !IsDialogMessage( hPasek, & msg ) ) { TranslateMessage( & msg ); DispatchMessage( & msg ); } } return msg.wParam; }
LRESULT CALLBACK WndProc( HWND hwnd, UINT mesg, WPARAM wParam, LPARAM lParam ) { switch( mesg ) { case WM_COMMAND: { HWND ret = CreateDialog( GetModuleHandle( NULL ), MAKEINTRESOURCE( 200 ), hwnd, NULL ); ShowWindow( ret, SW_SHOW ); if( ret == 201 ) { RysujKolo( hwnd ); break; } else if( ret == 202 ) { MessageBox( hwnd, "2", "2", MB_ICONINFORMATION ); break; } else if( ret == 203 ) { MessageBox( hwnd, "3", "3", MB_ICONINFORMATION ); break; } else if( ret = 204 ) { MessageBox( hwnd, "4", "4", MB_ICONINFORMATION ); break; } } break; case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc( hwnd, mesg, wParam, lParam ); } return 0; }
|
|
pekfos |
» 2021-06-10 17:40:12 Próbujesz użyć dialogu niemodalnego jakby to był dialog modalny. Po utworzeniu dialogu niemodalnego okno główne funkcjonuje niezależnie. Nie masz zwracania kodu liczbowego. Interakcję z dialogiem powinieneś obsługiwać w procedurze dialogu, której nie masz (ostatni argument do CreateDialog()). |
|
sekretarz11 Temat założony przez niniejszego użytkownika |
» 2021-06-11 19:28:42 Dzięki za pomoc, poprawiłem kod, natomiast nie rozumiem komunikacji między DlgProc a głównym procesem. Po naciśnięciu przycisku koło się rysuje ale niestety nie w głównym oknie tylko w oknie narzędzi. Jak to zmienić? Z góry dzięki za pomoc. PS. Na dole umieszczam zrzut ekranu jak działa program. #if defined(UNICODE) && !defined(_UNICODE) #define _UNICODE #elif defined(_UNICODE) && !defined(UNICODE) #define UNICODE #endif #include <stdio.h> #include <tchar.h> #include <windows.h> #include "pasek.h"
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ); BOOL CALLBACK DlgProc( HWND, UINT, WPARAM, LPARAM );
TCHAR szClassName[ ] = _T( "CodeBlocksWindowsApp" );
HWND hPasek;
int WINAPI WinMain( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nCmdShow ) { HWND hwnd; MSG messages; WNDCLASSEX wincl; wincl.hInstance = hThisInstance; wincl.lpszClassName = szClassName; wincl.lpfnWndProc = WndProc; wincl.style = CS_DBLCLKS; wincl.cbSize = sizeof( WNDCLASSEX ); wincl.hIcon = LoadIcon( NULL, IDI_APPLICATION ); wincl.hIconSm = LoadIcon( NULL, IDI_APPLICATION ); wincl.hCursor = LoadCursor( NULL, IDC_ARROW ); wincl.lpszMenuName = NULL; wincl.cbClsExtra = 0; wincl.cbWndExtra = 0; wincl.hbrBackground =( HBRUSH ) COLOR_BACKGROUND; if( !RegisterClassEx( & wincl ) ) return 0; hwnd = CreateWindowEx( 0, szClassName, _T( "Code::Blocks Template Windows App" ), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 800, 800, HWND_DESKTOP, NULL, hThisInstance, NULL ); HWND hPrzyc = CreateWindowEx( 0, "BUTTON", "Menu Narzêdzi", WS_CHILD | WS_VISIBLE, 10, 10, 760, 25, hwnd, NULL, hThisInstance, NULL ); ShowWindow( hwnd, nCmdShow ); while( GetMessage( & messages, NULL, 0, 0 ) ) { TranslateMessage( & messages ); DispatchMessage( & messages ); } return messages.wParam; }
void RysujKolo( HWND hwnd ) { HDC hdcOkno = GetDC( hwnd ); HBRUSH PedzelZiel, PedzelCzerw, PedzelNieb, PedzelZolty, PedzelRoz, Pudelko; HPEN Piornik; PedzelZiel = CreateSolidBrush( 0x00FF00 ); PedzelCzerw = CreateSolidBrush( 0x0000FF ); PedzelNieb = CreateSolidBrush( 0xFF0000 ); PedzelZolty = CreateSolidBrush( 0x00FFFF ); PedzelRoz = CreateSolidBrush( 0xFF00FF ); Pudelko =( HBRUSH ) SelectObject( hdcOkno, PedzelZiel ); Ellipse( hdcOkno, 10, 10, 510, 510 ); SelectObject( hdcOkno, Pudelko ); DeleteObject( PedzelZiel ); DeleteObject( PedzelCzerw ); DeleteObject( PedzelNieb ); DeleteObject( PedzelZolty ); DeleteObject( PedzelRoz ); ReleaseDC( hwnd, hdcOkno ); }
int WINAPI WinDlg( HINSTANCE hThisInstance, HINSTANCE hPrevInstance, LPSTR lpszArgument, int nFunsterStil ) { HWND hwnd; MSG msg; while( GetMessage( & msg, NULL, 0, 0 ) ) { if( !IsDialogMessage( hPasek, & msg ) ) { TranslateMessage( & msg ); DispatchMessage( & msg ); } } return msg.wParam; }
LRESULT CALLBACK WndProc( HWND hwnd, UINT mesg, WPARAM wParam, LPARAM lParam ) { switch( mesg ) { case WM_COMMAND: { HWND ret = CreateDialog( GetModuleHandle( NULL ), MAKEINTRESOURCE( 200 ), hwnd, DlgProc ); ShowWindow( ret, SW_SHOW ); } break; case WM_DESTROY: PostQuitMessage( 0 ); break; default: return DefWindowProc( hwnd, mesg, wParam, lParam ); } return 0; }
BOOL CALLBACK DlgProc( HWND hwnd, UINT Msg, WPARAM wParam, LPARAM lParam ) { switch( Msg ) { case WM_COMMAND: { switch( LOWORD( wParam ) ) { case 204: { RysujKolo( hwnd ); break; } case 202: break; } } break; default: return FALSE; } return TRUE; }
|
|
pekfos |
» 2021-06-11 20:39:19 Pierwszy argument w procedurze okna (dialogu) to uchwyt na te właśnie okno. Żeby się odwoływać do innych okien, musisz sobie sam zorganizować jakiś mechanizm. Na przykład możesz zapisać sobie uchwyt do okna głównego w zmiennej globalnej. |
|
sekretarz11 Temat założony przez niniejszego użytkownika |
» 2021-06-11 20:56:27 Dzięki wielkie. Wreszcie zrozumiałem i działa program prawidłowo. ;) |
|
« 1 » |