dbQuery Napisano Marzec 5, 2013 Zgłoś Share Napisano Marzec 5, 2013 Witam serdecznie! Już tutaj kiedyś zabawiłem i zdobyłem potrzebną mi pomoc. (http://forum.unit1.p...6157#entry26157) Teraz wracam po latach, gdyż WinAPI jest mi niesamowicie potrzebne. Problem jest jeden. W programie mam 3 przyciski. Po poruszeniu programu przyciski przestają działać (brak odzewu po najechaniu na nie myszką/klikanie ich). HWND Okno; HBITMAP bitmapa; BITMAP info_bitmapy; HWND button1,button2,button3,button4,button5; < Definy od bitmapy i od buttonów. GetWindowRect(hDesktop, &desktop); horizontal = desktop.right; vertical = desktop.bottom; Okno=CreateWindowEx(0,wc.lpszClassName,"ARCHANIELSKI PROGRAM WSZECHMOCY",WS_POPUP,(horizontal/2)-350,(vertical/2)-280,640,320,0,0,hInst,0); button1 = CreateWindowEx( 0, "BUTTON", "sarasra", WS_CHILD | WS_VISIBLE, 70, 240, 180, 35, Okno, NULL, hInst, NULL ); button2 = CreateWindowEx( 0, "BUTTON", "nanana", WS_CHILD | WS_VISIBLE, 390, 240, 180, 35, Okno, NULL, hInst, NULL ); button3 = CreateWindowEx( 0, "BUTTON", "X", WS_CHILD | WS_VISIBLE, 605, 20, 15, 15, Okno, NULL, hInst, NULL ); MSG msgs; ShowWindow(Okno,nShow); UpdateWindow(Okno); < WinMain case WM_PAINT: hdc=BeginPaint(hwnd,&ps); hdcBitmapy=CreateCompatibleDC(hdc); SelectObject(hdcBitmapy,bitmapa); BitBlt(hdc,0,0,info_bitmapy.bmWidth,info_bitmapy.bmHeight,hdcBitmapy,0,0,SRCCOPY); bitmapa=(HBITMAP)SelectObject(hdcBitmapy,bitmapa); DeleteDC(hdcBitmapy); EndPaint(hwnd,&ps); break; < A tutaj WM_PAINT, w którym za cholere nie wiem jak mam się obejść z buttonami. Kombinowałem już z BitBlt na 1000 sposobów, ale za każdym razem albo nie poprawnie coś definiuję, albo buttony zostają tak jak były - nie do użycia. Dzięki za wszelaką pomoc! Link do komentarza Udostępnij na innych stronach More sharing options...
5corpio Napisano Marzec 6, 2013 Zgłoś Share Napisano Marzec 6, 2013 Eh. Winapi nigdy nie było moją mocną stroną. Bazowałem tylko na podstawach żeby podpiąć OpenGL-a ale weź skompiluj kod i podrzuć cały program gdzieś na FTP to sciągne i zobacze co jest nie tak i patrząć w dokumentacje zobaczymy co jest nie tegez z twoim kodem. Edit: nie kodziłem nigdy długo w cepie ale jestem pewien, że są dla niego jakieś biblioteki czy coś co znacznie ułatwiają tworzenie tych żmudnych kontrolek i wszystkiego innego w WinApi. Może warto spróbować ? Ot taka mini-strona moja po godzinach http://www.wnetrzekuchni.pl Link do komentarza Udostępnij na innych stronach More sharing options...
dbQuery Napisano Marzec 6, 2013 Autor Zgłoś Share Napisano Marzec 6, 2013 Eh. Winapi nigdy nie było moją mocną stroną. Bazowałem tylko na podstawach żeby podpiąć OpenGL-a ale weź skompiluj kod i podrzuć cały program gdzieś na FTP to sciągne i zobacze co jest nie tak i patrząć w dokumentacje zobaczymy co jest nie tegez z twoim kodem. Edit: nie kodziłem nigdy długo w cepie ale jestem pewien, że są dla niego jakieś biblioteki czy coś co znacznie ułatwiają tworzenie tych żmudnych kontrolek i wszystkiego innego w WinApi. Może warto spróbować ? WinAPI ma wystąpić tylko jako ładne okrycie, dla innych moich trwogich kodów. :] Sprawdź PM. Dzięki! Link do komentarza Udostępnij na innych stronach More sharing options...
5corpio Napisano Marzec 6, 2013 Zgłoś Share Napisano Marzec 6, 2013 Ok ale pisz tutaj to inni też będą mogli udzielić ew. odpowiedzi. Ot taka mini-strona moja po godzinach http://www.wnetrzekuchni.pl Link do komentarza Udostępnij na innych stronach More sharing options...
dbQuery Napisano Marzec 6, 2013 Autor Zgłoś Share Napisano Marzec 6, 2013 Jeśli wyjaśnimy to na jakiejkolwiek fazie wspólnymi siłami, to oczywiście można tutaj udzielić odpowiedzi. Jak na razie stoję na tym że funkcja MoveWindow buguje buttony i nie wiem jak je "odświeżyć". Link do komentarza Udostępnij na innych stronach More sharing options...
5corpio Napisano Marzec 6, 2013 Zgłoś Share Napisano Marzec 6, 2013 Ok ściągnąłem to ale nie mam żadnego środowiska do C++ możesz skompilować to też i podesłać exeka? Ot taka mini-strona moja po godzinach http://www.wnetrzekuchni.pl Link do komentarza Udostępnij na innych stronach More sharing options...
dbQuery Napisano Marzec 6, 2013 Autor Zgłoś Share Napisano Marzec 6, 2013 Wiadome. PM. =) A o to kod: #include <windows.h> #include "Resource.h" #pragma comment(lib, "comctl32.lib") #include <commctrl.h> #pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") HWND Window,button1,button2,button3; HINSTANCE hInst; LRESULT CALLBACK WindProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam); RECT MainRect; POINT point; POINT curpoint; INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX WndCls; static char szAppName[] = "launcherEntrada"; MSG Msg; hInst = hInstance; WndCls.cbSize = sizeof(WndCls); WndCls.style = CS_VREDRAW; WndCls.lpfnWndProc = WindProcedure; WndCls.cbClsExtra = 0; WndCls.cbWndExtra = 0; WndCls.hInstance = hInst; WndCls.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); WndCls.hCursor = LoadCursor(NULL, IDC_ARROW); WndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); WndCls.lpszMenuName = NULL; WndCls.lpszClassName = szAppName; WndCls.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1)); RegisterClassEx(&WndCls); int horizontal = 0; int vertical = 0; RECT desktop; const HWND hDesktop = GetDesktopWindow(); GetWindowRect(hDesktop, &desktop); horizontal = desktop.right; vertical = desktop.bottom; Window = CreateWindowEx(0, szAppName, "WSZECHMOCNY PROGRAM MOCY", WS_POPUP | WS_VISIBLE, (horizontal/2)-350,(vertical/2)-280,640,320, NULL, NULL, hInstance, NULL); button1 = CreateWindowEx(0, "BUTTON", "Połącz z serwerem", WS_CHILD | WS_VISIBLE, 70, 240, 180, 35, Window, NULL, hInstance, NULL); button2 = CreateWindowEx(0, "BUTTON", "Przejdź na stronę", WS_CHILD | WS_VISIBLE, 390, 240, 180, 35, Window, NULL, hInstance, NULL); button3 = CreateWindowEx(0, "BUTTON", "X", WS_CHILD | WS_VISIBLE, 605, 20, 15, 15, Window, NULL, hInstance, NULL); while( GetMessage(&Msg, NULL, 0, 0) ) { TranslateMessage(&Msg); DispatchMessage( &Msg); } return static_cast<int>(Msg.wParam); } LRESULT CALLBACK WindProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { HDC hDC, MemDCExercising; PAINTSTRUCT Ps; HBITMAP bmpExercising; switch(Msg) { case WM_COMMAND: if(( HWND ) lParam == button3) PostQuitMessage(WM_QUIT); if(( HWND ) lParam == button2) ShellExecute(NULL, "open", "http://www.magicznastrona.mocy/", NULL, NULL, SW_SHOWNORMAL); if(( HWND ) lParam == button1) ShellExecute(NULL, "open", "something://localhost", NULL, NULL, SW_SHOWNORMAL); break; case WM_LBUTTONDOWN: SetCapture( hWnd ); GetWindowRect(Window, &MainRect); GetCursorPos(&point); ScreenToClient(hWnd, &point); break; case WM_MOUSEMOVE: GetCursorPos(&curpoint); if(wParam==MK_LBUTTON) MoveWindow(hWnd, curpoint.x - point.x, curpoint.y - point.y, MainRect.right - MainRect.left, MainRect.bottom - MainRect.top, TRUE); break; case WM_PAINT: hDC = BeginPaint(hWnd, &Ps); bmpExercising = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP1)); MemDCExercising = CreateCompatibleDC(hDC); SelectObject(MemDCExercising, bmpExercising); BitBlt(hDC, 0, 0, 640, 320, MemDCExercising, 0, 0, SRCCOPY); DeleteDC(MemDCExercising); DeleteObject(bmpExercising); EndPaint(hWnd, &Ps); break; default: return DefWindowProc(hWnd, Msg, wParam, lParam); } return 0; } ^ main.cpp Link do komentarza Udostępnij na innych stronach More sharing options...
5corpio Napisano Marzec 6, 2013 Zgłoś Share Napisano Marzec 6, 2013 Jutro to poczytam. Ale od razu spytam czemu nie masz break; Na końcu: case WM_COMMAND: ? Ot taka mini-strona moja po godzinach http://www.wnetrzekuchni.pl Link do komentarza Udostępnij na innych stronach More sharing options...
dbQuery Napisano Marzec 6, 2013 Autor Zgłoś Share Napisano Marzec 6, 2013 Dzięki! Wydaje mi się, że zapomniałem o breaku, jak próbowałem sobie uzmysłowić stary kod programu. Tak czy siak wiele to nie zmienia. Przyciski dalej po przesunięciu programu idą do piachu. Link do komentarza Udostępnij na innych stronach More sharing options...
5corpio Napisano Marzec 7, 2013 Zgłoś Share Napisano Marzec 7, 2013 A spróbuj przy tworzeniu każdego buttona w CreateWindowEx nadac każdemu jeszcze unikatowe ID tak jak np. w tym tutku: http://www.infernodevelopment.com/c-win32-api-tutorial to jest ten 3parametr od końca w funkcji i wtedy sprawdzać w WM_COMMAND właśnie po tym ID tak jak tam. Chociaż wydaje mi się, że sprawdzenie samego uchwytu powinno działać jak u ciebie jest to zrobione. Ot taka mini-strona moja po godzinach http://www.wnetrzekuchni.pl Link do komentarza Udostępnij na innych stronach More sharing options...
dbQuery Napisano Marzec 7, 2013 Autor Zgłoś Share Napisano Marzec 7, 2013 Spróbowałem, ale za pewne nie ma to żadnego znaczenia. Dla testu, jeszcze raz z WM_PAINT pozbyłem się rysowania bitmapy, zostawiłem samo okienko. Po wykonaniu się MoveWindow buttony przestają działać -> trzeba je od nowa narysować. Tylko tutaj się pojawia pewien mały problem, w jaki sposób.. (Tu zaznaczam, że umieszczanie CreateWindowEx w miejscach pokroju WM_PAINT również ma opór w działaniu). Zacząłem testować jeszcze więcej i wnioski: -> Jeśli WS_POPUP (styl okienka) zmienię w "obramowany", wtedy poruszanie okienka za pomocą obramowania (paska z nazwą) wykona się bez problemu + przyciski działają, -> w przypadku przesuwania jego wnętrza (tak jak funkcja była zamierzona (przyczepianie okienka do kursora)) przyciski dezaktywują się, -> wyczytałem iż: http://msdn.microsof...s632600(v=vs.85).aspx (WS_CHILD - A window with this style cannot have a menu bar. This style cannot be used with the WS_POPUP style.), -> ale: grywałem kiedyś w pewną grę, której okienko launcherowe wygląda następująco: . ^ - (stąd też pomysł, na przesuwalne okienko etc.). Wszystko inne można sprawdzić, za pośrednictwem tego programu: http://www.angusj.com/resourcehacker/ (a tutaj link do launchera tej gry: http://sunshine-rp.pl/do.rar). Niestety ja nie mam już więcej pomysłów. Ba! I ostatnia obserwacja.. To nie tylko dezaktywuje buttony, ale i też całe okienko. Ustawiłem sobie przez przypadek styl okna na "WS_EX_APPWINDOW" po czym przesunąłem okno (MoveWindow). Okno było "sparaliżowane". Nie dało się go rozciągnąć, ni nic. Jedna funkcja, a potrafi zniweczyć wszystkie plany.. ReleaseCapture(); Dzięki wielkie za pomoc! Siedziałem, siedziałem, patrzę na kod.. SetCapture - ta funkcja jest chyba na dłuższą metę. No i tak też było. Naprawiłem to poprzez prostą funkcję: case WM_LBUTTONDOWN: SetCapture( Window ); GetWindowRect(Window, &MainRect); GetCursorPos(&point); ScreenToClient(Window, &point); break; case WM_MOUSEMOVE: GetCursorPos(&curpoint); if(wParam==MK_LBUTTON) { MoveWindow(Window, curpoint.x - point.x, curpoint.y - point.y, 640, 320, FALSE); } else ReleaseCapture(); break; Jeszcze raz dzięki! Teraz mogę iść spokojnie spać. Dobranoc. Link do komentarza Udostępnij na innych stronach More sharing options...
Polecane posty
Zarchiwizowany
Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.