Come inviare WM_LBUTTONDOWN e WM_LBUTTONUP da pushbutton

di Anonimizzato8644 il
2 risposte
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

  • Grazie skynet di avermi risposto e di avermi dato questo link. Adesso cerco di analizzarlo e vedere se mi può dare dei buoni consigli, anche se utilizza le MFC ed io sto cercando di fare questo programma utilizzando solamente le funzioni API con il linguaggio C.

    Matteo
Devi accedere o registrarti per scrivere nel forum
2 risposte