Skocz do zawartości

[WinAPI] Program przyczepiany do kursora - ciąg dalszy


dbQuery

Polecane posty

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

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

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

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

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

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: 55825566.jpg. ^ - (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

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...