小编use*_*346的帖子

如何发光最小化.最大和关闭按钮?

我按照以下指南使用DWM API创建自定义Aero Frame.

使用DWM的自定义窗口框架

我的工作:

void CMainFrame::OnActivate(UINT nState,CWnd* pWndOther,BOOL bMinimized )
{
    CFrameWnd::OnActivate(nState,pWndOther,bMinimized);
    BOOL fDwmEnabled = FALSE;
    if (SUCCEEDED(DwmIsCompositionEnabled(&fDwmEnabled)))
    {
        if(nState == WA_ACTIVE )
        {
            MARGINS margins ={-1};
            HRESULT hr = DwmExtendFrameIntoClientArea(m_hWnd, &margins);
            if (!SUCCEEDED(hr));
        }
    }
}

void CMainFrame::OnNcPaint(){
    RECT rcClient;
    GetWindowRect(&rcClient);
    // Inform the application of the frame change.
    SetWindowPos( 
             NULL, 
             rcClient.left, rcClient.top,
             RECTWIDTH(rcClient), RECTHEIGHT(rcClient),
             SWP_FRAMECHANGED);
    CFrameWnd::OnNcPaint();
    CDC* dc = GetWindowDC();
    dc->FillSolidRect(0,0,RECTWIDTH(rcClient),RECTHEIGHT(rcClient),RGB(0,0,0));
}

 LRESULT CMainFrame::OnNcHitTest(CPoint p)
 {
    LRESULT r ;
    r = CFrameWnd::OnNcHitTest( p);      
    if(r == HTMINBUTTON || …
Run Code Online (Sandbox Code Playgroud)

c++ winapi mfc

9
推荐指数
1
解决办法
1083
查看次数

从 C 语言在 64 位汇编函数中传递参数。哪个寄存器接收这些参数?

我想将参数从 C 传递给汇编函数。

在类 UNIX 系统上,前六个参数为 rdi、rsi、rdx、rcx、r8 和 r9。

在 Windows 上,前四个参数为 rcx、rdx、r8 和 r9。

现在,我的问题是:在 BIOS 或 DOS 编程级别上,哪些寄存器接收这些参数?如果参数数量超过6个,如何编写程序集来处理这些参数?

c assembly x86-64 calling-convention

6
推荐指数
1
解决办法
1万
查看次数

如何移动窗口上客户区的起始坐标?

我参考了下面的文章,用 DWM 绘制自定义框架区域。 使用 DWM 自定义窗口框架 删除标准框架后,框架中不存在非客户区。

void CMainFrame::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
    int nTHight = 30; /*The title bar height*/
    RECT * rc;
    RECT aRect;
    RECT bRect;
    RECT bcRect;
    if(bCalcValidRects == TRUE)
    {
        CopyRect(&aRect,&lpncsp->rgrc[1]); 
        CopyRect(&bRect,&lpncsp->rgrc[0]);
        bcRect.left = bRect.left;
        bcRect.top = bRect.top - nTHight;
        bcRect.right = bRect.right;
        bcRect.bottom = bRect.bottom;
        CopyRect(&lpncsp->rgrc[0],&bcRect);
        CopyRect(&lpncsp->rgrc[1],&bRect);
        CopyRect(&lpncsp->rgrc[2],&aRect);
    }
    else
    {
        rc = (RECT *)lpncsp;
        rc->left = rc->left;
        rc->top = rc->top - nTHight;
        rc->right = rc->right;
        rc->bottom = rc->bottom;
    }

    CFrameWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
}
Run Code Online (Sandbox Code Playgroud)

因为整个窗口都是客户端区域,所以我必须调整框架的 UI …

c++ winapi mfc aero dwm

5
推荐指数
1
解决办法
1645
查看次数

无法在Windows 10下关闭OSK.exe

我使用下面的代码打开osk.exe

HINSTANCE Dlg::ExecuteOSK()
{
    typedef BOOL (WINAPI * LPFN_IsWow64Process)(HANDLE, PBOOL);
    typedef BOOL (WINAPI * LPFN_Wow64DisableWow64FsRedirection)(PVOID *);
    typedef BOOL (WINAPI * LPFN_Wow64RevertWow64FsRedirection)(PVOID);
    LPFN_IsWow64Process fnIsWow64Process = NULL;
    LPFN_Wow64DisableWow64FsRedirection fnWow64DisableWow64FsRedirection = NULL;
    LPFN_Wow64RevertWow64FsRedirection fnWow64RevertWow64FsRedirection = NULL;
    fnIsWow64Process = (LPFN_IsWow64Process) GetProcAddress(GetModuleHandle(TEXT("kernel32")), "IsWow64Process");
    fnWow64DisableWow64FsRedirection = (LPFN_Wow64DisableWow64FsRedirection) GetProcAddress(GetModuleHandle(TEXT("kernel32")), "Wow64DisableWow64FsRedirection");
    fnWow64RevertWow64FsRedirection = (LPFN_Wow64RevertWow64FsRedirection) GetProcAddress(GetModuleHandle(TEXT("kernel32")), "Wow64RevertWow64FsRedirection");
    BOOL bIsWow64 = FALSE;
    PVOID OldValue = NULL;
    HINSTANCE handle;
    if (NULL == fnIsWow64Process || NULL == fnWow64DisableWow64FsRedirection || NULL == fnWow64RevertWow64FsRedirection)
    {
        handle = ::ShellExecute(NULL, "open", "OSK", NULL, NULL, SW_SHOW);
    } …
Run Code Online (Sandbox Code Playgroud)

c++ winapi mfc win32gui

2
推荐指数
1
解决办法
604
查看次数

标签 统计

c++ ×3

mfc ×3

winapi ×3

aero ×1

assembly ×1

c ×1

calling-convention ×1

dwm ×1

win32gui ×1

x86-64 ×1