Ho usato nel solito modo sia la DialogBoxParam() che CALLBACK... ma nell'altro non funziona
Questo il file .cpp
#include"resource.h"
#include<Windows.h>
#include<stdio.h>
class Dialogo
{
public:
Dialogo();
void conta_click(HWND, UINT, WPARAM, LPARAM);
void chiudi_finestra(HWND, UINT, WPARAM, LPARAM);
void azzera_click(HWND, UINT, WPARAM, LPARAM);
void set(int, HWND, UINT, WPARAM, LPARAM);
private:
void (Dialogo::*elenco[3])(HWND, UINT, WPARAM, LPARAM);
char conta[10];
int contatore;
};
BOOL CALLBACK procDialog_1(HWND hwndDlg_1, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
static Dialogo conta;
int indice= -1;
if (uMsg == WM_CLOSE)indice = 0; //chiudi finestra intero 16
if (uMsg == WM_COMMAND)
{
WORD wNotifica = HIWORD(wParam); //estrae la notifica
WORD wId = LOWORD(wParam); //estrae l'ID dello static che ha mandato la notifica
if (wNotifica == BN_CLICKED and wId== STATIC_bottone)indice = 1; //chiama la funzione conta_click
if (wNotifica == STN_CLICKED and wId==STATIC_conta_click)indice = 2; //chiama la funzione azzera_click
}
if (indice >=0)
{
conta.set(indice, hwndDlg_1, uMsg, wParam, lParam);
//elenco[indice](hwndDlg_1, uMsg, wParam, lParam);
indice = -1;
return true;
}
else return false;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
DialogBoxParam(0, "dialogo_1", 0, procDialog_1, 0);
return 0;
}
void Dialogo::conta_click(HWND handle , UINT msg, WPARAM w, LPARAM l)
{
contatore++;
sprintf_s(conta, 10, "%ld", contatore);
HWND id_finestra = GetDlgItem(handle, STATIC_conta_click); //recupera l'indirizzo dello STATIC, handle è l'indirizzo di DIALOGO_1
//HWND id_finestra = (HWND)l; //recupera l'indirizzo dello static che ha mandato il messaggio
SendMessage(id_finestra, WM_SETTEXT, 0, (LPARAM)conta);
}
void Dialogo::chiudi_finestra(HWND handle, UINT msg, WPARAM w, LPARAM l)
{
EndDialog(handle, 0);
}
void Dialogo::azzera_click(HWND handle, UINT msg, WPARAM wP, LPARAM lP)
{
contatore = 0;
sprintf_s(conta, 10, "%ld", contatore);
SendMessage((HWND)lP, WM_SETTEXT, 0,(LPARAM)conta);
}
void Dialogo::set(int indice, HWND handle, UINT msg, WPARAM w, LPARAM l)
{
(this->*elenco[indice])(handle, msg, w, l);
}
Dialogo::Dialogo()
{
elenco[0] = &Dialogo::chiudi_finestra;
elenco[1] = &Dialogo::conta_click;
elenco[2] = &Dialogo::azzera_click;
contatore = 0;
}
questo il file risorse
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// Italiano (Italia) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ITA)
LANGUAGE LANG_ITALIAN, SUBLANG_ITALIAN
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
//
DIALOGO_1 DIALOGEX 0, 0, 213, 133
STYLE DS_SETFONT | DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "DIALOGO 1"
FONT 8, "MS Sans serif", 0, 0, 0x0
BEGIN
CTEXT "premi per zero",1,73,67,50,10,SS_NOTIFY | WS_BORDER | NOT WS_GROUP
DEFPUSHBUTTON "Premi_per contare",2,65,25,67,24,BS_CENTER | BS_NOTIFY | WS_BORDER | NOT WS_TABSTOP,WS_EX_TRANSPARENT
END
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO
BEGIN
"DIALOGO_1", DIALOG
BEGIN
BOTTOMMARGIN, 131
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// AFX_DIALOG_LAYOUT
//
DIALOGO_1 AFX_DIALOG_LAYOUT
BEGIN
0
END
#endif // Italiano (Italia) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
questo l'header del file risorse
//{{NO_DEPENDENCIES}}
// File di inclusione generato con Microsoft Visual C++.
// Utilizzato da Resource.rc
//
#define STATIC_bottone 2
#define STATIC_conta_click 1
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif