0

我想建立一个颜色选择器。我试过这段代码

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

4

2 回答 2

2

GetPixel函数返回一个COLORREF值(实际上只是一个DWORD指定像素的 RGB 值的值)。

但是您的代码将 的返回值GetPixel视为一个字符串,将其传递给lstrcpy. 那是行不通的。lstrcpy将把它解释为好像它是指向内存中某处的字符串的指针。

这就解释了为什么你会胡说八道P»©,因为该GetPixel函数并没有真正返回内存地址,并且该地址处的内存实际上并不包含有效的以 nul 结尾的字符串。

如果要将格式化的数值显示为字符串,则需要使用printf-style 函数来完成此操作。Win32 API 变体称为wsprintf.

于 2013-05-08T19:20:04.530 回答
1

您不是在尝试格式化字符串而是数字,您需要将正确的标志和说明符传递给 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

于 2013-05-08T23:32:20.733 回答