masm程序集如何使用getpixel来构建颜色选择器

时间:2013-05-08 19:09:04

标签: windows winapi assembly masm

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

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

之类的内容

2 个答案:

答案 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