⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 win_win32.c

📁 大名鼎鼎的CE下播放软件,TCPPMP的源代码!!!2410下可以流畅的解QVGA的H264,MPEG4等格式.
💻 C
📖 第 1 页 / 共 5 页
字号:
		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 + -