我的资源文件里的图标都是16x16的,用 Call DrawIconEx(hDC, udtIconRect.Left + 2&, udtIconRect.Top + (udtIconRect.Bottom - udtIconRect.Top + 1& - 16&) / 2&, LoadResPicture(szIconID, vbResIcon), 16&, 16&, 0&, 0&, DI_NORMAL) 在每个菜单项上绘制显示的图标尺寸都一切正常。
 
可问题是,当使用 Call DrawState(hDC, 0&, 0&, LoadResPicture(szIconID, vbResIcon), 0&, udtIconRect.Left + 2&, udtIconRect.Top + (udtIconRect.Bottom - udtIconRect.Top + 1& - 16&) / 2&, 16&, 16&, DST_ICON Or DSS_UNION Or DSS_DISABLED) 想把无效不可用的菜单项图标绘制成灰色时,图标的尺寸就变大了。即便是将DrawState的参数n3、n4都设置成16,也仅仅是对图标进行了切割,图标还是变大的显示不完整。实在令人不解,请问有朋友知道这是怎么回事儿吗?

解决方案 »

  1.   

    不会变大啊,可能是其它地方出问题了,比如:Private Declare Function DrawIconEx Lib "user32" (ByVal hDC As Long, ByVal xLeft As Long, ByVal yTop As Long, ByVal hIcon As Long, ByVal cxWidth As Long, ByVal cyWidth As Long, ByVal istepIfAniCur As Long, ByVal hbrFlickerFreeDraw As Long, ByVal diFlags As Long) As Long
    Private Const DI_MASK = &H1
    Private Const DI_IMAGE = &H2
    Private Const DI_NORMAL = DI_MASK Or DI_IMAGE
    Private Declare Function DrawState Lib "user32" Alias "DrawStateA" (ByVal hDC As Long, ByVal hBrush As Long, ByVal lpDrawStateProc As Long, ByVal lParam As Long, ByVal wParam As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal n3 As Long, ByVal n4 As Long, ByVal un As Long) As Long
    Private Const DST_ICON As Long = &H3
    Private Const DSS_DISABLED = &H20&Private Sub Command1_Click()
        DrawIconEx Me.hDC, 10, 10, LoadPicture("d:\001.ico").Handle, 16, 16, 0, 0, DI_NORMAL
    End SubPrivate Sub Command2_Click()
        DrawState Me.hDC, 0, 0, LoadPicture("d:\001.ico").Handle, 0, 10, 10, 16, 16, DST_ICON Or DSS_DISABLED
    End SubPrivate Sub Form_Load()
        Me.ScaleMode = vbPixels
    End Sub
      

  2.   

    我把这个自绘弹出式菜单的示例程序上传上来了,麻烦大家帮我看看到底是哪儿出了问题吧
    http://download.csdn.net/source/2778551
      

  3.   

    分析就不必了,自己与成功的对比一下。
    http://www.vbaccelerator.com/home/VB/Code/Controls/Menus/Popup_Menu_ActiveX_DLL/article.asp
      

  4.   

    事实上, LoadResPicture会导致取出的图标是32*32的。虽然你DrawIconEx成功了,是因为DrawIconEx这个支持缩放,也就是说,你先放大,后缩小了。
    解决办法是用LoadImageA加载资源文件里面的图标,当然还要OleCreatePictureIndirect取得StdPicture对象。我用你的工程实验过,可以的。
      

  5.   

    太感谢 hpygzhx520 了!我说怎么直接从磁盘中加载16x16的图标用DrawState显示就正常,而从资源文件中载入DrawState就显示不正常呢,果然是DrawState和LoadResPicture的问题呀。再次感谢! \( ^ O ^ )/