我想建立一个颜色选择器。我试过这段代码
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
答案 0 :(得分:2)
GetPixel
函数返回COLORREF
值(实际上只是DWORD
指定像素的RGB值。)
但是您的代码将GetPixel
的返回值视为字符串,并将其传递给lstrcpy
。那不行。 lstrcpy
将把它解释为好像它是指向内存中某个字符串的指针。
这解释了为什么你会像P»©
那样胡说八道,因为GetPixel
函数并没有真正返回一个内存地址,并且该地址的内存并不真正包含有效的nul-终止字符串。
如果要将格式化的数值显示为字符串,则需要使用printf
- 样式函数来完成此操作。 Win32 API变体名为wsprintf
。
答案 1 :(得分: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