65.9K
CodeProject 正在变化。 阅读更多。
Home

查找常见 Windows 标志的工具

starIconstarIconstarIconstarIconstarIcon

5.00/5 (4投票s)

2002 年 2 月 20 日

2分钟阅读

viewsIcon

50749

downloadIcon

1367

一个简单的工具,用于解码 Windows 标志,例如窗口样式、扩展样式。支持拖放。

Sample Image - flaglookup.jpg

引言

标志查找是一个简单的实用工具,用于将标志解码为组合它们以形成它们的各个值。它还演示了在 VC++ 调试器和您的应用程序之间拖放值。它可以找到用于窗口样式、扩展窗口样式、类样式和 SetWindowPos 标志的标志值。

描述

我们通过组合单个位(例如 WS_CHILD | WS_BORDER)来为某些 Windows 函数创建标志。问题在于,在调试时,给定一个组合值,很难找到用于 OR 运算以创建它的各个值。此实用程序读取该值并在列表框中显示每个位。

您可以将其复制粘贴一个值,或从调试器窗口中拖放它。目前,它已为窗口样式、扩展窗口样式、类样式和 SetWindowPos 标志实现。您可以毫不费力地添加新的集合。

工作原理

用于显示的字符串定义在数组中,如下所示

const char* bExtendedStyles[128]=
{
    "WS_EX_RIGHTSCROLLBAR", //0x00000000L
    "WS_EX_DLGMODALFRAME",  //0x00000001L
    "",
    "WS_EX_NOPARENTNOTIFY", //0x00000004L
    "WS_EX_TOPMOST",        //0x00000008L
    "WS_EX_ACCEPTFILES",    //0x00000010L
    "WS_EX_TRANSPARENT",    //0x00000020L
    .
    .
    .
}

数组的顺序必须与位的顺序相同(即二进制 0001、0010、0100、1000 等)。我通过复制 Windows 头文件(在本例中为 winuser.h)中的 #defines 来创建数组。对于每种类型(窗口样式、扩展窗口样式等)将有一个单独的数组。我只是将相应的数组传递给显示字符串的函数。

现在,查找值的逻辑很简单,我遍历输入值中的每个位,如果该位已设置(=1),我就从数组中获取相应的值并将其添加到列表框中。

为了实现拖放,有一个类 CFLDropTarget,它是从 COleDropTarget 派生的。覆盖了 OnDrop 函数。在此函数中,使用以下内容来获取从调试器“变量”窗口拖入的值。

BOOL CFLDropTarget::OnDrop(CWnd* pWnd, COleDataObject* pDataObject,
                           DROPEFFECT dropEffect, CPoint point)
{

    HGLOBAL hData = pDataObject->GetGlobalData(CF_TEXT);
    char *pData = (char*)GlobalLock(hData);
    CString strData = pData;

    int nIndex = strData.ReverseFind('\t');

    strData = strData.Mid(nIndex+1);
    strData.TrimLeft();
    strData.TrimRight();
    . . .
    . . .

Dlg 类具有 CFLDropTarget 对象作为成员。在对话框类的 OnCreate 中调用成员上的 Register 方法。

© . All rights reserved.