2

Win32 ASM のプロジェクトとして、最近開発した Java アプリの ASM バージョンを作成しようとしていますが、タイトルが示すように、GdiGradientFill に問題があります。現時点では、FASM を使用し、INVOKE や WIN32 インクルードの使用などの高レベルの ASM 構造を避けることをお勧めします。

私が持っているもの、atm:

PUSH    [hWnd]                                                  
CALL    [User32.GetWindowDC]                                
MOV     [hDC], EAX                          
PUSH    rectClient                              
PUSH    [hWnd]                          
CALL    [User32.GetClientRect]  

PUSH    [rectClient.left]
POP     [colorOne.xPos]
PUSH    [rectClient.top]
POP     [colorOne.yPos] 
MOV     [colorOne.red],     0xC000
MOV     [colorOne.green],   0xC000
MOV     [colorOne.blue],    0xC000
MOV     [colorOne.alpha],   0x0000

PUSH    [rectClient.right]
POP     [colorTwo.xPos]
PUSH    [rectClient.bottom]
POP     [colorTwo.yPos] 
MOV     [colorTwo.red],     0x0000
MOV     [colorTwo.green],   0x2800
MOV     [colorTwo.blue],    0x7700
MOV     [colorTwo.alpha],   0x0C00

MOV     [gRect.UpperLeft],  0
MOV     [gRect.LowerRight], 1

PUSH    GRADIENT_FILL_RECT_H                            
PUSH    1                               
PUSH    gRect                               
PUSH    2                           
PUSH    colorOne                            
PUSH    [hDC]                               
CALL    [GDI32.GdiGradientFill]

ただし、コードは FALSE のみを返し、両方の MSDN を通過した後 ( http://msdn.microsoft.com/en-us/library/windows/desktop/dd373585(v=vs.85).aspx )

および他のいくつかの例 (http://www.asmcommunity.net/board/index.php?topic=4100.0) を参照してください。

Msimg32 の GradientFill を使用しようとしたときに別の問題がありました。これは常にクラッシュにつながるためです。これは正確ですか、それともこのフォームで問題を経験した人はいますか?

コード全体の Pastebin リンク: http://pastebin.com/GEHDw6Qe

助けてくれてありがとう、SS

編集: コードは現在機能しています。正直なところ、何が変わったのかわかりません。PUSH / POP シーケンスを MOV EAX に変更する以外に、以前と現在の作業データの間に違いはありません。[rectClient.left]、 ect (PUSH / POP メソッドも機能します) - 支援を提供してくれた人々に感謝します!

4

1 に答える 1

1

GdiGradientFill の 4 番目のパラメーターとして、RECT のように見えるものを渡しています。この関数は GRADIENT_TRIANGLE を想定しています。

また、PUSH/POP は、あるメモリ ロケーションから別のメモリ ロケーションにコピーする非常に奇妙な方法です。2回ではなく4回のメモリアクセスを行っています。レジスタを介してコピーします。これは Java ではありません。

GetWindowDC が必要なものであると確信していますか? これは、ウィンドウ全体、タイトル、ボーダー、およびすべての DC を返します。クライアント領域だけでは、通常は GetDC() を使用します。完了したら、ReleaseDC() を呼び出します。

于 2013-01-03T02:19:33.840 に答える