Pozn. Ke klíči problému se dostávám až úplně nakonec nejdříve popisuji odkud beru HWND, ale pak nakonec stejně dojdu k tomu, že mám HPROPSHEETPAGE (handle stránky, na kterou chci vykreslit ovládací prvky nebo je schovat), ale nemám HWND. Takže je nějaká funkce, která mi vrátí ten handle na ovl. prvek? Tady nic není https://msdn.microsoft.com/en-us/library/aa921598.aspx tak jak to vyřešit? Jak mám říct že chci na určité stránce překreslit prvky když ta stránka nemusí být aktivovaná. Příkaz dávám z menu.
Problém v souboru formsfunction.h includovaného někde z hlavního souboru:
PropSheetData propdata_local
HWND test = propdata_local.pages.map1;
Ve funkci potřebuju použít HWND ale nevím jak mám ten HWND získat.
void SwitchMapCopy(PropSheetData propdata_local){
HWND hControl, test;
test = propdata_local.pages.map1;
static bool on;
on = !on ? true : false; // expects Map Copy is off
int i;
for (i = 0; i<NUM_MAPCOPY_CONTROLS; i++ )
{
hControl = GetDlgItem(test, mapCopyControls[i]);
if (hControl){
if (on)
ShowWindow(hControl, SW_SHOW);
else
ShowWindow(hControl, SW_HIDE);
}
else
int a = 1;
}
}
Hlavní soubor obsahuje:
bool Sheet_HandleCommand(HWND hSheet, WORD code, WORD id, HWND control)
{
bool ret = true;
switch (id)
{
case ID_VIEW_MAPCOPY:
if (GetMenuState(GetMenu(hSheet), ID_VIEW_MAPCOPY, MF_BYCOMMAND) & MF_CHECKED) {
propdata.mapCopyOn = false;
propdata.mapMatrixOn = true;
// hide controls ....
SwitchMapCopy(propdata);
// clear check
CheckMenuItem(GetMenu(hSheet), ID_VIEW_MAPCOPY, MF_BYCOMMAND);
CheckMenuItem(GetMenu(hSheet), ID_VIEW_MAPMATRIX, MF_BYCOMMAND | MF_CHECKED);
}
else {
propdata.mapCopyOn = true;
propdata.mapMatrixOn = false;
// show controls ...
SwitchMapCopy(propdata);
CheckMenuItem(GetMenu(hSheet), ID_VIEW_MAPCOPY, MF_BYCOMMAND | MF_CHECKED);
CheckMenuItem(GetMenu(hSheet), ID_VIEW_MAPMATRIX, MF_BYCOMMAND);
}
break;
Když z menu vyberu položku Map Copy tak potřebuju schovat nebo zobrazit prvky, které jsou na stránce
HWND propdata.pages.map1
Sheet_HandleCommand ale obsahuje HWND hSheet; voláno odtud:...
INT_PTR CALLBACK MainDlgProc(HWND hSheet, UINT msg, WPARAM wParam, LPARAM lParam)
{
INT_PTR ret = FALSE;
switch (msg)
{
case WM_COMMAND:
ret = 0; //processing message
if (!Sheet_HandleCommand(hSheet, HIWORD(wParam), LOWORD(wParam), (HWND)lParam))
CALLPROC();
break;
default:
return CALLPROC();
}
return ret;
}
pproc = (DLGPROC)SetWindowLong(hSheet, DWL_DLGPROC, (LONG)&MainDlgProc);
#define CALLPROC() CallWindowProc((WNDPROC)pproc, hSheet, msg, wParam, lParam)
int WINAPI WinMain(HINSTANCE hWINAPI, HINSTANCE, LPTSTR cmdline, int cmdshow)
{
MSG msg;
BOOL ret;
HWND hSheet
....
hSheet = MakeSheet(hWINAPI);
....
pproc = (DLGPROC)SetWindowLong(hSheet, DWL_DLGPROC, (LONG)&MainDlgProc);
}
Hláška kterou jsem dostal:
test = propdata_local.pages.map1;
Error 2 error C2440: '=' : cannot convert from 'HPROPSHEETPAGE' to 'HWND' ... formsfunctions.cpp 52
Aby ale bylo jasné co má být v té struktruře propdata_local:
struct PAGES_t
{ // don't move! // page index:
HPROPSHEETPAGE info; // 0
HPROPSHEETPAGE players; // 1
HPROPSHEETPAGE victory; // 2
HPROPSHEETPAGE disables; // 3
HPROPSHEETPAGE map1; // 4
HPROPSHEETPAGE units1; // 5
HPROPSHEETPAGE triggers1; // 6
HPROPSHEETPAGE map2; // 7
HPROPSHEETPAGE units2; // 8
HPROPSHEETPAGE triggers2; // 9
};
extern struct PropSheetData
{
int pindex; //current player number
class Player *p; //current player struct
int sel0, sel1; //page dependant, should be reset on SETACTIVE
HWND statusbar;
HWND mapview;
HMENU menu;
UINT tformat, ecformat, mcformat; //clipboard formats
bool mapMatrixOn;
bool mapCopyOn;
PAGES_t pages;
} propdata;