我想建立一个颜色选择器。我试过这段代码
invoke GetDC,NULL
mov esi,eax
invoke GetPixel,esi,400,400
invoke lstrcpy,string ,eax
invoke SetDlgItemText,hWin,textbox1,string
invoke ReleaseDC,NULL,esi
但它会返回P»©
和类似的东西。我如何让它返回类似的东西00F0F0F0h
该GetPixel
函数返回一个COLORREF
值(实际上只是一个DWORD
指定像素的 RGB 值的值)。
但是您的代码将 的返回值GetPixel
视为一个字符串,将其传递给lstrcpy
. 那是行不通的。lstrcpy
将把它解释为好像它是指向内存中某处的字符串的指针。
这就解释了为什么你会胡说八道P»©
,因为该GetPixel
函数并没有真正返回内存地址,并且该地址处的内存实际上并不包含有效的以 nul 结尾的字符串。
如果要将格式化的数值显示为字符串,则需要使用printf
-style 函数来完成此操作。Win32 API 变体称为wsprintf
.
您不是在尝试格式化字符串而是数字,您需要将正确的标志和说明符传递给 wsprintf。*printf 所做的是格式化您传递给它的任何内容,它会根据您的格式说明符转换为字符串,并将该字符串放入传递给lpOut
.
该%s
说明符用于格式化字符串。假设我想将返回值显示GetPixel
为 8 位十六进制数字,数字前面有 0x。
.data
szFmt db "%#08x", 0
.data?
Buf db 12 dup (?)
.code
invoke GetDC, NULL
invoke GetPixel, eax, 200, 200
invoke wsprintf, offset Buf, offset szFmt, eax
invoke MessageBox, NULL, offset Buf, NULL, MB_OK
而不是调用MessageBox
,您可以执行以下操作:
invoke SetDlgItemText, hWin, textbox1, offset Buf
试试看,看看MessageBox
显示什么
http://msdn.microsoft.com/en-us/library/windows/desktop/ms647550(v=vs.85).aspx