Come inviare WM_LBUTTONDOWN e WM_LBUTTONUP da pushbutton

di il
2 risposte

Come inviare WM_LBUTTONDOWN e WM_LBUTTONUP da pushbutton

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;
}

2 Risposte

Devi accedere o registrarti per scrivere nel forum
2 risposte