WIN32API使用“选择颜色”函数

aeef0ec04cc311a83f2fce103cedcbff.gif

与本机 VFP 函数 GetColor() 没有太大区别。

DO declare


#DEFINE CC_RGBINIT 1
#DEFINE CC_FULLOPEN 2
#DEFINE CC_PREVENTFULLOPEN 4
#DEFINE CC_SHOWHELP 8
#DEFINE CC_SOLIDCOLOR 128
#DEFINE CC_ANYCOLOR 256
#DEFINE CC_WIDE 32


*| typedef struct {
*|   DWORD        lStructSize;      0:4
*|   HWND         hwndOwner;        4:4
*|   HWND         hInstance;        8:4
*|   COLORREF     rgbResult;       12:4
*|   COLORREF   * lpCustColors;    16:4
*|   DWORD        Flags;           20:4
*|   LPARAM       lCustData;       24:4
*|   LPCCHOOKPROC lpfnHook;        28:4
*|   LPCTSTR      lpTemplateName;  32:4
*| } CHOOSECOLOR, *LPCHOOSECOLOR; total=36 bytes


#DEFINE CHOOSECOLOR_SIZE     36


*| typedef DWORD COLORREF;
*| typedef DWORD *LPCOLORREF;
*| 0x00bbggrr
#DEFINE COLORREF_ARRAY_SIZE  64


LOCAL hWindow, lcBuffer, lnInitColor, lnFlags,;
  lnCustColors, lcCustColors, ii


hWindow = GetActiveWindow()


* the color initially selected when the dialog box is created
lnInitColor = Rgb(128,0,0)


* allocating memory block for 16 COLORREF values (DWORD)
* for the custom color boxes in the dialog box
* and filling this memory with zeroes


#DEFINE GMEM_FIXED 0
lnCustColors = GlobalAlloc(GMEM_FIXED, COLORREF_ARRAY_SIZE)
= ZeroMemory(lnCustColors, COLORREF_ARRAY_SIZE)


* initialization flags
lnFlags = CC_FULLOPEN + CC_RGBINIT


* compiling the CHOOSECOLOR structure
lcBuffer = num2dword(CHOOSECOLOR_SIZE) +;
  num2dword(hWindow) +;
  num2dword(0) +;
  num2dword(lnInitColor) +;
  num2dword(lnCustColors) +;
  num2dword(lnFlags) +;
  num2dword(0) +;
  num2dword(0) +;
  num2dword(0)


IF ChooseColor(@lcBuffer) <> 0
* the OK button of the dialog box has been selected
  ? "Color selected:", buf2dword(SUBSTR(lcBuffer, 13,4))


  ? "Custom colors stored:"
  
  * copying the memory block content to a VFP string
  * just to have an opportunity to work with its substring;
  * quite weird way, though not much choice available
  * considering the VFP specifics


  lcCustColors = Repli(Chr(0), COLORREF_ARRAY_SIZE)
  = Heap2Str(@lcCustColors, lnCustColors, COLORREF_ARRAY_SIZE)


  FOR ii=1 TO 16
    ? ii, buf2dword(SUBSTR(lcCustColors, (ii-1)*4+1, 4))
  ENDFOR
ENDIF


* free the memory block if you do not use it for the
* following calls to this function
= GlobalFree(lnCustColors)


* end of main


FUNCTION num2dword (lnValue)
#DEFINE m0 0x100
#DEFINE m1 0x10000
#DEFINE m2 0x1000000
  LOCAL b0, b1, b2, b3
  b3 = Int(lnValue/m2)
  b2 = Int((lnValue - b3*m2)/m1)
  b1 = Int((lnValue - b3*m2 - b2*m1)/m0)
  b0 = Mod(lnValue, m0)
RETURN Chr(b0)+Chr(b1)+Chr(b2)+Chr(b3)


FUNCTION buf2dword (lcBuffer)
#DEFINE MAX_DWORD 0xffffffff
#DEFINE MAX_LONG 0x7FFFFFFF
  LOCAL lnResult
  lnResult = Asc(SUBSTR(lcBuffer, 1,1)) + ;
    Asc(SUBSTR(lcBuffer, 2,1)) * 256 +;
    Asc(SUBSTR(lcBuffer, 3,1)) * 65536 +;
    Asc(SUBSTR(lcBuffer, 4,1)) * 16777216
RETURN IIF(lnResult>MAX_LONG, lnResult-MAX_DWORD, lnResult)


PROCEDURE declare
  DECLARE INTEGER ChooseColor IN comdlg32 STRING @lpcc
  DECLARE INTEGER GetActiveWindow IN user32
  DECLARE INTEGER GlobalFree IN kernel32 INTEGER hMem
  DECLARE RtlZeroMemory IN kernel32 As ZeroMemory;
    INTEGER dest, INTEGER numBytes


  DECLARE INTEGER GlobalAlloc IN kernel32;
    INTEGER wFlags, INTEGER dwBytes


  DECLARE RtlMoveMemory IN kernel32 As Heap2Str;
      STRING @, INTEGER, INTEGER

移山计划-微信公众号

完成内容:VFP 公众号API标准库+使用文档

完成方式:托管代码库发布,完成一节点比用户相关就发布,这样随时可用,不必等全部库完成。

完成时间:约三个月。

60bdfb5f146a0f685d9a884a7a42f48d.jpeg

猫猫的心里话

加菲猫的VFP|狐友会社群接收投稿啦

加菲猫的VFP,用VFP不局限VFP,用VFP混合一切。无论是VFP,还是JS,还是C,只要能混合起来,都可以发表。

商业模式,销售技巧、需求规划、产品设计的知识通通可以发表。

暂定千字50元红包,,优秀的文章红包更大,一经发表,红包到手。

如何帮助使用VFP的人?

用VFP的人,有专业的,有非专业了,很多人其实是小白,问出的问题是小白,如果问题不对,我们引导他们问正确的问题。无论如何请不要嘲笑他们说帮助都不看,这么简单的问题都不会,嘲笑别人不行,而无法提出建设性答案,是很low的。

我们无论工作需要,还是有自己的软件,都是是需要真正的知识,如何让更多人学习真正的VFP知识呢,只需要点赞,在看,能转发朋友圈就更好了。

加菲猫的vfp倡导用"VFP极简混合开发,少写代码、快速出活,用VFP,但不局限于VFP,各种语言混合开发"

我已经带领一百多名会员成功掌到VFP的黑科技,进入了移动互联网时代,接下来我们要进入物联网领域。

2023年狐友会社群会员继续招募中

社群会员获取的权益有:

祺佑三层开发框架商业版(猫框),终身免费升级,终身技术支持。

开放的录播课程有:

微信小程序,微信公众号开发,H5 APP开发,Extjs BS开发,VFP面向对象进阶,VFP中间层开发。

源码类资源有:

支付组件源码,短信源码,权限组件源码,一些完整系统的源码。这个可以单独出售的,需要的可以联系我。

会员也可以实现群内资源对接,可以接分包,合作等各项商业或技术业务

fe4bfccdfbfd6edd07f9b16d1863678a.gif

02c6f94287a6a7ceda0c193bfd4aa77b.jpeg

359038fc31d699cddd38cbd5f152eeee.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值