API创建窗口,遇到些问题。。
1、消息过滤 如果为静态 就没法 设为虚函数??
2、WndProc默认消息处理函数为静态,怎么访问 非静态 _hWnd ??
我只是瞎捣鼓,
没实际需求,
这样编译出来全动态 空窗口 才95KB
<火山程序 类型 = "通常" 版本 = 1 />
包 火山.程序
类 启动类 <公开 基础类 = 程序类>
{
变量 win <公开 类型 = win>
方法 启动方法 <公开 类型 = 整数>
{
win.创建窗口 (, , , , , , , , )
win.消息循环 ()
返回 (1)
}
#
}
类 win <公开>
{
变量 _hInstance <公开 类型 = 变整数 折叠>
变量 _AppIcon <公开 类型 = 变整数>
变量 _AppSmallIcon <公开 类型 = 变整数>
变量 _ArrowCursor <公开 类型 = 变整数>
变量 _HandCursor <公开 类型 = 变整数>
变量 _SizeAllCursor <公开 类型 = 变整数>
变量 _hFont <公开 类型 = 变整数>
变量 _hBoldFont <公开 类型 = 变整数>
变量 _hLinkFont <公开 类型 = 变整数>
变量 _hWnd <公开 类型 = 变整数>
变量 _strFile <公开 类型 = 文本型>
方法 类_初始化 <折叠>
{
@ @<_hInstance>=(INT_P)GetModuleHandle(NULL);
_strFile = 取空白文本 (1024)
@ GetModuleFileName(NULL,(LPWSTR)@<_strFile>.GetText(),255);
如果 (_AppIcon == 0)
{
@ @<_AppIcon>=(INT_P)LoadIcon((HINSTANCE)@<_hInstance>,(LPCWSTR)129);
如果 (_AppIcon != 0)
{
@ @<_AppSmallIcon>=(INT_P)LoadImage((HINSTANCE)@<_hInstance>,(LPCWSTR)129,IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
}
}
如果 (_AppIcon == 0)
{
@ @<_AppIcon>=(INT_P)LoadIcon((HINSTANCE)@<_hInstance>,(LPCWSTR)128);
如果 (_AppIcon != 0)
{
@ @<_AppSmallIcon>=(INT_P)LoadImage((HINSTANCE)@<_hInstance>,(LPCWSTR)128,IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
}
}
如果 (_AppIcon == 0)
{
@ @<_AppIcon> =(INT_P)LoadIcon((HINSTANCE)@<_hInstance>,(LPCWSTR)"DEFAULT_ICON");
如果 (_AppIcon != 0)
{
@ @<_AppSmallIcon>=(INT_P)LoadImage((HINSTANCE)@<_hInstance>,(LPCWSTR)"DEFAULT_ICON",IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
}
}
如果 (_AppIcon == 0)
{
变量 _hIcon <类型 = 变整数>
@ SHFILEINFO psfi;
@ SHGetFileInfo(@<_strFile>.GetText(),FILE_ATTRIBUTE_NORMAL,&psfi,348,SHGFI_ICON|SHGFI_LARGEICON);
@ @<_hIcon>=(INT_P)psfi.hIcon;
如果 (_hIcon == 0)
{
@ SHGetFileInfo(_T("*.exe"),FILE_ATTRIBUTE_NORMAL,&psfi,348,SHGFI_ICON|SHGFI_LARGEICON|SHGFI_USEFILEATTRIBUTES);
@ @<_hIcon>=(INT_P)psfi.hIcon;
}
_AppIcon = _hIcon
}
如果 (_AppSmallIcon == 0)
{
变量 _hIcon <类型 = 变整数>
@ SHFILEINFO psfi;
@ SHGetFileInfo(@<_strFile>.GetText(),FILE_ATTRIBUTE_NORMAL,&psfi,348,SHGFI_ICON|SHGFI_SMALLICON);
@ @<_hIcon>=(INT_P)psfi.hIcon;
如果 (_hIcon == 0)
{
@ SHGetFileInfo(_T("*.exe"),FILE_ATTRIBUTE_NORMAL,&psfi,348,SHGFI_ICON|SHGFI_SMALLICON|SHGFI_USEFILEATTRIBUTES);
@ @<_hIcon>=(INT_P)psfi.hIcon;
}
_AppSmallIcon = _hIcon
}
@ @<_ArrowCursor> = (INT_P)LoadCursor(0,IDC_ARROW);
@ @<_HandCursor> = (INT_P)LoadCursor (0, IDC_HAND);
@ @<_SizeAllCursor> = (INT_P)LoadCursor (0, IDC_SIZEALL);
@ @<_hFont>=(INT_P)GetStockObject(DEFAULT_GUI_FONT);
@ LOGFONT lf;
@ GetObject((HANDLE)@<_hFont>,60,&lf);
@ lf.lfWeight = 700;
@ lf.lfUnderline = 0;
@ @<_hBoldFont>=(INT_P)CreateFontIndirect(&lf);
@ lf.lfWeight = 400;
@ lf.lfUnderline = 1;
@ @<_hLinkFont> = (INT_P)CreateFontIndirect(&lf);
}
方法 注册类名 <类型 = 逻辑型 折叠 @禁止流程检查 = 真>
参数 lpClassName <类型 = 文本型>
参数 hInstance <类型 = 变整数 @默认值 = 0>
{
如果 (hInstance == 0)
{
@ @<hInstance>=(INT_P)GetModuleHandle(NULL);
}
// @ WNDCLASSEX lpwcx;
// @ lpwcx.cbSize =48;// LocalSize(lpwcx);
// @ lpwcx.hIcon =0;// (HICON)@<_AppIcon>;
// @ lpwcx.hCursor = (HCURSOR)@<_ArrowCursor>;
// @ lpwcx.hbrBackground = (HBRUSH)16;
// @ lpwcx.hIconSm =0;// (HICON)@<_AppSmallIcon>;
// @ lpwcx.lpfnWndProc=(WNDPROC)@<WndProc>;
// @ lpwcx.hInstance = (HINSTANCE)@<hInstance>;
// @ lpwcx.lpszClassName =_T("asd"); //@<lpClassName>.GetText();
// @ return (BOOL)RegisterClassEx(&lpwcx);
@ WNDCLASS wc;
@ wc.style = CS_HREDRAW | CS_VREDRAW;//
@ wc.lpfnWndProc = (WNDPROC)@<WndProc>;
@ wc.cbClsExtra = 0;
@ wc.cbWndExtra = 0;
@ wc.hInstance = (HINSTANCE)@<hInstance>;
@ wc.hIcon = LoadIcon((HINSTANCE)@<hInstance>, MAKEINTRESOURCE(100));
@ wc.hCursor = LoadCursor(nullptr, IDC_ARROW);
@ wc.hbrBackground= (HBRUSH)16;
@ wc.lpszMenuName = nullptr;
@ wc.lpszClassName=@<lpClassName>.GetText();
@ return (BOOL)RegisterClassW(&wc);
}
方法 创建窗口 <公开 类型 = 变整数 折叠 @禁止流程检查 = 真>
参数 父窗口句柄 <类型 = 变整数 @默认值 = 0>
参数 窗口标题 <类型 = 文本型 @默认值 = "zyWin">
参数 左边 <类型 = 整数 @默认值 = 0>
参数 顶边 <类型 = 整数 @默认值 = 0>
参数 宽度 <类型 = 整数 @默认值 = 300>
参数 高度 <类型 = 整数 @默认值 = 200>
参数 风格 <类型 = 整数 @默认值 = 13565952>
参数 扩展风格 <类型 = 整数 @默认值 = 8>
参数 窗口类名 <类型 = 文本型 @默认值 = "zyWin">
{
如果 (注册类名 (窗口类名))
{
@ @<_hWnd>=(INT_P)CreateWindowEx((DWORD)@<扩展风格>,(LPCWSTR)@<窗口类名>.GetText(),(LPCWSTR)@<窗口标题>.GetText(),(DWORD)@<风格>,(int)@<左边>,(int)@<顶边>,(int)@<宽度>,(int)@<高度>,(HWND)@<父窗口句柄>,NULL,(HINSTANCE)@<_hInstance>,NULL);
@ SendMessage((HWND)@<_hWnd>,WM_SETICON,ICON_BIG,@<_AppIcon>);
@ SendMessage((HWND)@<_hWnd>,WM_SETICON,ICON_SMALL,@<_AppSmallIcon>);
@ ShowWindow((HWND)@<_hWnd>,SW_SHOW);
返回 (_hWnd)
}
否则
{
返回 (0)
}
}
方法 消息循环 <公开 折叠 @禁止流程检查 = 真>
参数 WinhWnd <类型 = 变整数 @默认值 = 0>
{
@ MSG msg;
@ while (GetMessage (&msg,(HWND)@<WinhWnd>,0,0))
@ {
@ TranslateMessage (&msg);
@ DispatchMessage (&msg);
@ }
}
方法 WndProc <静态 类型 = 变整数 @禁止流程检查 = 真>
参数 hWnd <类型 = 变整数>
参数 wMsg <类型 = 整数 注释 = "提供消息的具体值">
参数 wParam <类型 = 变整数 注释 = "提供消息所附带的参数1的值">
参数 lParam <类型 = 变整数 注释 = "提供消息所附带的参数2的值">
{
@ if(@<wMsg>==WM_DESTROY)
@ {
// @ if(hWnd==@<_hWnd>)
// @ {
@ PostQuitMessage(0);
// @ }
@ }
返回 (消息过滤 (hWnd, wMsg, wParam, lParam))
}
方法 消息过滤 <公开 类型 = 变整数 返回值注释 = "返回真已处理" "//@虚拟方法" = 可覆盖 @禁止流程检查 = 真>
参数 hWnd <类型 = 变整数>
参数 wMsg <类型 = 整数 注释 = "提供消息的具体值">
参数 wParam <类型 = 变整数 注释 = "提供消息所附带的参数1的值">
参数 lParam <类型 = 变整数 注释 = "提供消息所附带的参数2的值">
{
@ return DefWindowProc((HWND)@<hWnd>,(UINT)@<wMsg>,(WPARAM)@<wParam>,(LPARAM)@<lParam>);
}
#
}
页:
[1]