📄 win_win32.c
字号:
if (p->WndTB)
{
if (p->MenuDef)
{
TBBUTTONINFO Button;
const menudef* i = p->MenuDef;
int No = 0;
while (i->Level>=0)
{
i = SkipButtons(p,i);
if (i->Level<0)
break;
if (No<2)
{
int Id = No ? WIN_B : WIN_A;
p->WinCmd[No] = i->Id;
Button.cbSize = sizeof(Button);
Button.dwMask = TBIF_TEXT;
Button.pszText = (tchar_t*)LangStr(i->Class,i->Id);
SendMessage(p->WndTB,TB_SETBUTTONINFO,Id,(LPARAM)&Button);
++i;
if (i->Level>0)
{
p->Menu2[No] = (HMENU)SendMessage(p->WndTB,SHCMBM_GETSUBMENU,0,No ? WIN_B:WIN_A);
if (p->Menu2[No])
{
DeleteMenu(p->Menu2[No],No ? WIN_B_B:WIN_A_A,MF_BYCOMMAND);
i = MenuDef(p,i,0,&p->Menu2[No]);
}
}
if (No==1 && !p->Smartphone && Ver<500)
{
TBBUTTON Sep;
memset(&Sep,0,sizeof(Sep));
Sep.fsStyle = TBSTYLE_SEP;
SendMessage(p->WndTB,TB_INSERTBUTTON,No,(LPARAM)&Sep);
++No;
}
}
else
{
if (p->Smartphone)
break;
AddButton(p,No,i->Id,-2,(tchar_t*)LangStr(i->Class,i->Id),0);
++i;
assert(i->Level<=0); // no submenu allowed (only for WIN_A,WIN_B)
}
++No;
}
while (!p->Smartphone && SendMessage(p->WndTB,TB_BUTTONCOUNT,0,0)>No)
SendMessage(p->WndTB,TB_DELETEBUTTON,No,0);
}
GetWindowRect(p->WndTB, &RectTB);
if (Rect.bottom > RectTB.top)
Rect.bottom = RectTB.top;
//Rect.bottom -= (RectTB.bottom - RectTB.top);
MoveWindow(p->Wnd,Rect.left,Rect.top,Rect.right - Rect.left,Rect.bottom - Rect.top,0);
p->AygShellTB = 1;
p->Flags |= WIN_BOTTOMTOOLBAR;
if (p->Smartphone)
p->Flags |= WIN_2BUTTON;
if (p->Flags & WIN_DIALOG)
SendMessage(p->WndTB,SHCMBM_OVERRIDEKEY,VK_ESCAPE,
MAKELONG(SHMBOF_NODEFAULT|SHMBOF_NOTIFY,SHMBOF_NODEFAULT|SHMBOF_NOTIFY));
}
}
if (!p->WndTB)
{
p->TitleOK = p->TitleDone = !p->Smartphone;
p->TitleCancel = 1;
p->WndTB = CommandBar_Create(p->Module,p->Wnd,TOOLBAR_ID);
p->ToolBarHeight = CommandBar_Height(p->WndTB);
if (p->MenuDef)
{
MenuDef(p,p->MenuDef,0,&p->Menu3);
p->Menu2[0] = p->Menu3;
p->Menu2[1] = p->Menu3;
CommandBar_InsertMenubarEx(p->WndTB,NULL,(tchar_t*)p->Menu3,0);
}
CommandBar_Show(p->WndTB, TRUE);
}
}
#else
static WNDPROC OldToolBarProc = NULL;
static LRESULT CALLBACK ToolBarProc( HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam )
{
if (Msg == WM_MOUSEACTIVATE)
return MA_NOACTIVATE;
if (Msg == WM_LBUTTONUP)
{
int i;
int n=SendMessage(Wnd,TB_BUTTONCOUNT,0,0);
for (i=0;i<n;++i)
{
TBBUTTON Button;
RECT r;
POINT p;
SendMessage(Wnd,TB_GETBUTTON,i,(LPARAM)&Button);
if ((Button.fsState & TBSTATE_PRESSED))
{
if (IsMenu((HMENU)Button.dwData))
{
SendMessage(Wnd,TB_GETRECT,Button.idCommand,(LPARAM)&r);
p.x = LOWORD(lParam);
p.y = HIWORD(lParam);
if (PtInRect(&r,p))
{
p.x = r.left;
p.y = r.bottom;
ClientToScreen(Wnd,&p);
TrackPopupMenu((HMENU)Button.dwData,TPM_LEFTALIGN|TPM_TOPALIGN,
p.x,p.y,0,GetParent(Wnd),NULL);
}
}
}
}
}
return CallWindowProc(OldToolBarProc,Wnd,Msg,wParam,lParam);
}
static void DestroyToolBar(win* p)
{
DestroyWindow(p->WndTB);
p->WndTB = NULL;
}
static void AddMenu(win* p)
{
TBBUTTONINFO Info;
TBBUTTON Button;
tchar_t Name[256];
int Pos;
p->TitleCancel = 1;
p->TitleOK = 0;
p->TitleDone = 1;
p->NeedOK = 0;
p->Menu3 = NULL;
memset(&p->Menu2,0,sizeof(p->Menu2));
if (p->MenuDef)
{
MenuDef(p,p->MenuDef,0,&p->Menu3);
p->Menu2[0] = p->Menu3;
p->Menu2[1] = p->Menu3;
for (Pos=0;Pos<GetMenuItemCount(p->Menu3);++Pos)
{
GetMenuString(p->Menu3,Pos,Name,255,MF_BYPOSITION);
memset(&Button,0,sizeof(Button));
Button.iBitmap = -2;
Button.idCommand = GetMenuItemID(p->Menu3,Pos);
if (Button.idCommand < 0)
Button.idCommand = TOOLBAR_ID+Pos+1;
Button.fsState = TBSTATE_ENABLED;
Button.fsStyle = (BYTE)(TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE | BTNS_SHOWTEXT);
if (!Button.idCommand)
Button.fsStyle = TBSTYLE_SEP;
Button.dwData = (DWORD) GetSubMenu(p->Menu3,Pos);
Button.iString = 0;
SendMessage(p->WndTB,TB_INSERTBUTTON,Pos,(LPARAM)&Button);
Info.cbSize = sizeof(TBBUTTONINFO);
Info.dwMask = TBIF_TEXT;
Info.pszText = Name;
SendMessage(p->WndTB,TB_SETBUTTONINFO,Button.idCommand,(LPARAM)&Info);
}
}
SendMessage(p->WndTB,TB_AUTOSIZE,0,0);
}
void WinBitmap(win* p,int BitmapId16, int BitmapId32, int BitmapNum)
{
TBADDBITMAP Add;
Add.hInst = p->Module;
Add.nID = BitmapId16;
p->BitmapNo = SendMessage(p->WndTB,TB_ADDBITMAP,BitmapNum,(LPARAM)&Add);
}
static void CreateToolBar(win* p)
{
RECT r;
if ((p->Flags & WIN_NOMENU) == 0)
{
p->WndTB = CreateWindowEx(0, TOOLBARCLASSNAME, (LPCTSTR) NULL,
WS_CHILD|TBSTYLE_FLAT|TBSTYLE_LIST|WS_VISIBLE,
0, 0, 0, 0, p->Wnd, (HMENU)TOOLBAR_ID, p->Module, NULL);
if (p->WndTB)
{
SendMessage(p->WndTB, TB_BUTTONSTRUCTSIZE, (WPARAM) sizeof(TBBUTTON), 0);
SendMessage(p->WndTB,TB_SETEXTENDEDSTYLE,0,TBSTYLE_EX_MIXEDBUTTONS);
OldToolBarProc = (WNDPROC) GetWindowLong(p->WndTB,GWL_WNDPROC);
SetWindowLong(p->WndTB,GWL_WNDPROC,(LONG)ToolBarProc);
GetWindowRect(p->WndTB,&r);
p->ToolBarHeight = r.bottom - r.top;
AddMenu(p);
}
}
}
void DIASet(int State,int Mask)
{
}
int DIAGet(int Mask)
{
return DIA_TASKBAR & Mask;
}
void WinSetFullScreen(win* p,bool_t State)
{
if (State != p->FullScreen)
{
p->FullScreen = State;
if (State)
{
p->SaveStyle = GetWindowLong(p->Wnd,GWL_STYLE);
GetWindowRect(p->Wnd,(RECT*)&p->SaveRect);
SetWindowLong(p->Wnd,GWL_STYLE,WS_TABSTOP|WS_VISIBLE|WS_POPUP|WS_GROUP);
#ifdef NDEBUG
SetWindowPos(p->Wnd,HWND_TOPMOST,0,0,
#else
SetWindowPos(p->Wnd,HWND_NOTOPMOST,0,0,
#endif
GetSystemMetrics(SM_CXSCREEN),GetSystemMetrics(SM_CYSCREEN),SWP_FRAMECHANGED);
}
else
{
SetWindowLong(p->Wnd,GWL_STYLE,p->SaveStyle);
SetWindowPos(p->Wnd,HWND_NOTOPMOST,p->SaveRect[0],p->SaveRect[1],
p->SaveRect[2]-p->SaveRect[0],p->SaveRect[3]-p->SaveRect[1],SWP_FRAMECHANGED);
}
ShowWindow(p->WndTB,State ? SW_HIDE:SW_SHOWNA);
InvalidateRect(p->Wnd,NULL,0);
}
}
#endif
static int GetDataDefType(wincontrol* i)
{
datadef DataDef;
if (!NodeDataDef(i->Pin.Node,i->Pin.No,&DataDef))
return 0;
return DataDef.Type;
}
static void SetTrack(win* p,wincontrol* i,int Value)
{
tick_t Tick;
datadef DataDef;
if (!NodeDataDef(i->Pin.Node,i->Pin.No,&DataDef))
return;
if (DataDef.Format2 - DataDef.Format1 <= TRACKMAX)
Value += DataDef.Format1;
else
Value = DataDef.Format1 + Scale(DataDef.Format2 - DataDef.Format1,Value,TRACKMAX);
switch (DataDef.Type)
{
case TYPE_INT:
i->Pin.Node->Set(i->Pin.Node,i->Pin.No,&Value,sizeof(Value));
break;
case TYPE_TICK:
Tick = Value;
i->Pin.Node->Set(i->Pin.Node,i->Pin.No,&Tick,sizeof(Tick));
break;
}
}
static void WinControlDisable(win* p,wincontrol* Control,bool_t v)
{
if (Control->Disabled != v)
{
wincontrol* i;
Control->Disabled = v;
if (Control->Control)
EnableWindow(Control->Control,!v);
if (Control->Edit)
EnableWindow(Control->Edit,!v);
for (i=p->Controls;i;i=i->Next)
if (i->Ref == Control)
EnableWindow(i->Control,!v);
}
}
static void WinControlUpdate(win* p,wincontrol* i);
static void WinControlFocus(win* p,wincontrol* Control,bool_t Set);
static void WinControlSet(win* p,wincontrol* i,const datadef* DataDef,const void* Data,int Size,bool_t Update)
{
tchar_t DataOld[MAXDATA/sizeof(tchar_t)];
if (i->Pin.Node->Get(i->Pin.Node,i->Pin.No,DataOld,Size)==ERR_NONE && memcmp(Data,DataOld,Size)==0)
return;
if (i->Pin.Node->Set(i->Pin.Node,i->Pin.No,Data,Size)==ERR_NONE)
{
p->Flags |= WIN_PROP_CHANGED;
if (DataDef->Flags & DF_SOFTRESET)
p->Flags |= WIN_PROP_SOFTRESET;
if (DataDef->Flags & DF_RESTART)
p->Flags |= WIN_PROP_RESTART;
if (DataDef->Flags & DF_RESYNC)
p->Flags |= WIN_PROP_RESYNC;
if (Update)
WinControlUpdate(p,i);
}
}
static void WinControlCmd(win* p,wincontrol* i,HWND Control,int Cmd)
{
tchar_t s[256];
datadef DataDef;
switch (Cmd)
{
case CBN_CLOSEUP:
if (i->ComboBox)
p->ComboOpen = 0;
break;
case CBN_DROPDOWN:
if (i->ComboBox)
p->ComboOpen = 1;
break;
case LBN_SETFOCUS: //CBN_KILLFOCUS
if (p->Smartphone)
WinControlFocus(p,i,0);
p->ComboOpen = 0;
break;
case EN_SETFOCUS:
if (Control != i->Edit)
DIASet(DIA_SIP,DIA_SIP);
//no break
case CBN_SETFOCUS:
case BN_SETFOCUS:
WinControlFocus(p,i,0);
break;
case EN_KILLFOCUS:
if (Control != i->Edit)
DIASet(0,DIA_SIP);
break;
case EN_CHANGE:
if (!p->InUpdate && NodeDataDef(i->Pin.Node,i->Pin.No,&DataDef))
{
if (DataDef.Type == TYPE_STRING)
{
GetWindowText(Control,s,TSIZEOF(s));
WinControlSet(p,i,&DataDef,s,sizeof(s),0);
}
else
if (GetWindowText(Control,s,TSIZEOF(s))>0)
{
fraction f;
tick_t t;
int v = StringToInt(s,0);
switch (DataDef.Type)
{
case TYPE_INT:
if (DataDef.Flags & DF_PERCENT)
v = ScaleRound(v,PERCENT_ONE,100);
WinControlSet(p,i,&DataDef,&v,sizeof(v),0);
break;
case TYPE_TICK:
if (DataDef.Flags & DF_MSEC)
t = ScaleRound(v,TICKSPERSEC,1000);
else
t = v*TICKSPERSEC;
WinControlSet(p,i,&DataDef,&t,sizeof(t),0);
break;
case TYPE_FRACTION:
f.Num = v;
f.Den = 100;
WinControlSet(p,i,&DataDef,&f,sizeof(f),0);
break;
}
}
}
break;
case STN_CLICKED: //BN_CLICKED:
case LBN_SELCHANGE: //STN_DBLCLK: CBN_SELCHANGE:
if (i->Ref)
WinControlFocus(p,i->Ref,1);
else
if (!p->InUpdate && NodeDataDef(i->Pin.Node,i->Pin.No,&DataDef))
{
if (DataDef.Type == TYPE_RESET)
{
int Zero = 0;
wincontrol* j;
for (j=p->Controls;j;j=j->Next)
if (GetDataDefType(j)==TYPE_INT)
WinControlSet(p,j,&DataDef,&Zero,sizeof(Zero),1);
}
else
if (DataDef.Type == TYPE_BOOL)
{
bool_t Data;
if (i->Pin.Node->Get(i->Pin.Node,i->Pin.No,&Data,sizeof(Data))==ERR_NONE)
{
Data = !Data;
WinControlSet(p,i,&DataDef,&Data,sizeof(Data),1);
}
}
else
if (DataDef.Type == TYPE_INT)
{
int Data;
if (p->Smartphone)
{
Data = SendMessage(Control,LB_GETCURSEL,0,0);
if (Data>=0)
Data = SendMessage(Control,LB_GETITEMDATA,Data,0);
else
Data=0;
}
else
{
Data = SendMessage(Control,CB_GETCURSEL,0,0);
if (Data>=0)
Data = SendMessage(Control,CB_GETITEMDATA,Data,0);
else
Data=0;
}
WinControlSet(p,i,&DataDef,&Data,sizeof(Data),0);
}
else
if (DataDef.Type == TYPE_HOTKEY)
{
int Data;
if (i->Pin.Node->Get(i->Pin.Node,i->Pin.No,&Data,sizeof(Data))==ERR_NONE)
{
if (!Data)
{
node* QueryKey = NodeCreate(QUERYKEY_ID);
if (QueryKey)
{
int Key;
int Key2;
((win*)QueryKey)->Popup((win*)QueryKey,p);
QueryKey->Get(QueryKey,QUERYKEY_KEY,&Key,sizeof(Key));
QueryKey->Get(QueryKey,QUERYKEY_KEY2,&Key2,sizeof(Key2));
if (Key)
{
wincontrol* j;
int Data2;
int KeyCode = Key & ~HOTKEY_KEEP;
int Key2Code = Key2 & ~HOTKEY_KEEP;
if (!Key2Code) Key2Code = KeyCode;
for (j=p->Controls;j;j=j->Next)
if (j!=i && NodeDataDef(j->Pin.Node,j->Pin.No,&DataDef) && DataDef.Type == TYPE_HOTKEY &&
j->Pin.Node->Get(j->Pin.Node,j->Pin.No,&Data2,sizeof(Data2))==ERR_NONE &&
((Data2 & ~HOTKEY_KEEP) == KeyCode || (Data2 & ~HOTKEY_KEEP) == Key2Code))
{
Data2 = 0;
WinControlSet(p,j,&DataDef,&Data2,sizeof(Data2),1);
}
if (WinEssentialKey(KeyCode) && p->Smartphone)
Key &= ~HOTKEY_KEEP;
Data = Key;
WinControlSet(p,i,&DataDef,&Data,sizeof(Data),1);
}
NodeDelete(QueryKey);
}
}
else
{
Data = 0;
WinControlSet(p,i,&DataDef,&Data,sizeof(Data),1);
}
}
}
}
break;
}
}
static void WinControlUpdate(win* p,wincontrol* i)
{
datadef DataDef;
tchar_t Data[MAXDATA/sizeof(tchar_t)];
tchar_t s[256];
int Value;
int Result;
if (!NodeDataDef(i->Pin.Node,i->Pin.No,&DataDef))
return;
p->InUpdate = 1;
Result = i->Pin.Node->Get(i->Pin.Node,i->Pin.No,Data,DataDef.Size);
WinControlDisable(p,i,Result!=ERR_NONE);
if (Result != ERR_NONE && Result != ERR_NOT_SUPPORTED)
memset(Data,0,sizeof(Data));
switch (DataDef.Type)
{
case TYPE_HOTKEY:
HotKeyToString(s,TSIZEOF(s),*(int*)Data);
SetWindowText(i->Edit,s);
SetWindowText(i->Control,LangStr(PLATFORM_ID,*(int*)Data ? PLATFORM_CLEAR:PLATFORM_ASSIGN));
break;
case TYPE_BOOL:
SendMessage(i->Control,BM_SETCHECK,*(bool_t*)Data?BST_CHECKED:BST_UNCHECKED,0);
break;
case TYPE_INT:
if (DataDef.Flags & (DF_ENUMCLASS|DF_ENUMSTRING))
{
int GetCount;
int GetItemData;
int SetCurSel;
int No,Count;
#if defined(TARGET_WINCE)
if (p->Smartphone)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -