server 发表于 2023-7-18 00:30:16

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]
查看完整版本: API创建窗口,遇到些问题。。