Salve, ho realizzato un programma in C che utilizza le funzioni API e che mostra un dialogo dove digitando su 4 possibili controlli pushbutton, viene spostata una icona IDI_HAND verso l' alto, il basso, destra, sinistra. Il programma funziona ma adesso vorrei modificarlo in modo che l' icona continui a spostarsi fintantochè tengo premuto il pushbutton. So che per fare questo è necessario sfruttare i messaggi WM_LBUTTONDOWN e WM_LBUTTONUP, utilizzando le funzioni API SetTimer e KillTimer, ma ho osservato che cliccando sui controlli pushbutton essi inviano solamente il messaggio WM_COMMAND con codice di notifica BN_CLICKED, infatti se sostituisco nel programma l' istruzione:
if(umsg==WM_COMMAND)
con:
if(umsg==WM_LBUTTONDOWN)
l' icona non si sposta più, pertanto non so come fare per fargli inviare questi messaggi. Avreste qualche consiglio da darmi?
Il source file.cpp del programma è il seguente:
#define STRICT
#define WIN32_LEAN_AND_MEAN
#define OEMRESOURSE
#include <windows.h>
#include "risorse1.h"
BOOL CALLBACK spostamento_static_desiderato(HWND hwnd_static, int dx, int dy, RECT *dimensioni_dialogo)
{
WINDOWPLACEMENT wp;
ZeroMemory(&wp, sizeof(wp));
wp.length= sizeof(wp);
GetWindowPlacement(hwnd_static, &wp);
wp.rcNormalPosition.left= wp.rcNormalPosition.left +dx;
int eccesso = wp.rcNormalPosition.left -dimensioni_dialogo->left;
if(eccesso<0)
{
wp.rcNormalPosition.left= wp.rcNormalPosition.left -eccesso;
wp.rcNormalPosition.right= wp.rcNormalPosition.right -eccesso;
}
wp.rcNormalPosition.right= wp.rcNormalPosition.right +dx;
eccesso = wp.rcNormalPosition.right -dimensioni_dialogo->right;
if(eccesso>0)
{
wp.rcNormalPosition.left= wp.rcNormalPosition.left -eccesso;
wp.rcNormalPosition.right= wp.rcNormalPosition.right -eccesso;
}
wp.rcNormalPosition.top= wp.rcNormalPosition.top +dy;
eccesso = wp.rcNormalPosition.top -dimensioni_dialogo->top;
if(eccesso<0)
{
wp.rcNormalPosition.top= wp.rcNormalPosition.top -eccesso;
wp.rcNormalPosition.bottom= wp.rcNormalPosition.bottom -eccesso;
}
wp.rcNormalPosition.bottom= wp.rcNormalPosition.bottom +dy;
eccesso = wp.rcNormalPosition.bottom -dimensioni_dialogo->bottom;
if(eccesso>0)
{
wp.rcNormalPosition.top= wp.rcNormalPosition.top -eccesso;
wp.rcNormalPosition.bottom= wp.rcNormalPosition.bottom -eccesso;
}
return SetWindowPlacement(hwnd_static, &wp);
}
BOOL CALLBACK sposta_static(HWND hwnddlg, UINT umsg, WPARAM wparam, LPARAM lparam)
{
HWND hwnd_static= GetDlgItem(hwnddlg, IDC_STATIC);
HICON hwnd_icona= LoadIcon(0, IDI_HAND);
SendMessage(hwnd_static, STM_SETICON, (WPARAM)hwnd_icona, 0);
BITMAP bm;
HDC hdc = GetDC(hwnddlg);
HDC hdcmem= CreateCompatibleDC(hdc);
HBITMAP hwnd_bitmap1= LoadBitmap(0, MAKEINTRESOURCE(OBM_LFARROW));
SelectObject(hdcmem, hwnd_bitmap1);
GetObject(hwnd_bitmap1, sizeof(bm), &bm);
BitBlt(hdc, 150, 65, bm.bmWidth, bm.bmHeight, hdcmem, 0, 0, SRCCOPY);
DeleteObject(hwnd_bitmap1);
HBITMAP hwnd_bitmap2= LoadBitmap(0, MAKEINTRESOURCE(OBM_RGARROW));
SelectObject(hdcmem, hwnd_bitmap2);
GetObject(hwnd_bitmap2, sizeof(bm), &bm);
BitBlt(hdc, 225, 65, bm.bmWidth, bm.bmHeight, hdcmem, 0, 0, SRCCOPY);
DeleteObject(hwnd_bitmap2);
HBITMAP hwnd_bitmap3= LoadBitmap(0, MAKEINTRESOURCE(OBM_UPARROW));
SelectObject(hdcmem, hwnd_bitmap3);
GetObject(hwnd_bitmap3, sizeof(bm), &bm);
BitBlt(hdc, 188, 33, bm.bmWidth, bm.bmHeight, hdcmem, 0, 0, SRCCOPY);
DeleteObject(hwnd_bitmap3);
HBITMAP hwnd_bitmap4= LoadBitmap(0, MAKEINTRESOURCE(OBM_DNARROW));
SelectObject(hdcmem, hwnd_bitmap4);
GetObject(hwnd_bitmap4, sizeof(bm), &bm);
BitBlt(hdc, 188, 100, bm.bmWidth, bm.bmHeight, hdcmem, 0, 0, SRCCOPY);
DeleteObject(hwnd_bitmap4);
ReleaseDC(hwnddlg, hdc);
DeleteDC(hdcmem);
if(umsg==WM_CLOSE)
{
EndDialog(hwnddlg, 0);
return TRUE;
}
if(umsg==WM_COMMAND)
{
RECT dimensioni_dialogo;
GetClientRect(hwnddlg, &dimensioni_dialogo);
int spostamento=5;
int id_button=LOWORD(wparam);
HWND hwnd_static= GetDlgItem(hwnddlg, IDC_STATIC);
if(id_button==IDC_BUTTON1)
return spostamento_static_desiderato(hwnd_static, -spostamento, 0, &dimensioni_dialogo);
if(id_button==IDC_BUTTON2)
return spostamento_static_desiderato(hwnd_static, +spostamento, 0, &dimensioni_dialogo);
if(id_button==IDC_BUTTON3)
return spostamento_static_desiderato(hwnd_static, 0, -spostamento, &dimensioni_dialogo);
if(id_button==IDC_BUTTON4)
return spostamento_static_desiderato(hwnd_static, 0, +spostamento, &dimensioni_dialogo);
}
return FALSE;
}
int WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow)
{
DialogBoxParam(0,"IDD_DIALOG8",0,sposta_static,0);
return 0;
}