| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4243 人关注过本帖
标题:客户区贴图的问题
只看楼主 加入收藏
A_new
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2014-7-15
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
客户区贴图的问题
这一段玩起了汇编,看到有些注册机异型窗口,就想学一下,从网上找了几篇不过是C的,自己就拿汇编重复一下,可是总有问题,本人也是编程菜鸟,windows消息机制,也是一知半解,汇编也是新手,我把别人教程的C代码,和我写的汇编代码,附上,请高手指点一二
程序代码:
/ 对话框位图背景  - WM_CTLCOLORDLG中使用StretchBlt贴图
//By MoreWindows-(http://blog.)
#include <windows.h>
#include "resource.h"

const char szDlgTitle[] = "位图背景 使用StretchBlt贴图 MoreWindows-(http://blog.)";

// 对话框消息处理函数
BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
         
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc);
    return 0;
}


BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    RECT       rcDialog;
    HBITMAP    hBitmap;
    static BITMAP s_bm;
    static HDC    s_hdcMem;

    switch (message)
    {
    case WM_INITDIALOG:
        // 设置对话框标题
        SetWindowText(hDlg, szDlgTitle);
        // 设置对话框大小可调节
        SetWindowLong(hDlg, GWL_STYLE, GetWindowLong(hDlg, GWL_STYLE) | WS_SIZEBOX);

        // 加载背影图片
        hBitmap = (HBITMAP)LoadImage(NULL, "005.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
        if (hBitmap == NULL)
        {
            MessageBox(hDlg, "LoadImage failed", "Error", MB_ICONERROR);
            exit(0);
        }       
        else
        {
            // 将背影图片放入HDC - s_hdcMem
            HDC        hdc;
            hdc = GetDC(hDlg);
            s_hdcMem = CreateCompatibleDC(hdc);
            SelectObject(s_hdcMem, hBitmap);   
            ReleaseDC(hDlg, hdc);

            // 得到位图信息
            GetObject(hBitmap, sizeof(s_bm), &s_bm);
        }

        return 0;

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDCANCEL:
            DeleteDC(s_hdcMem);
            EndDialog(hDlg, LOWORD(wParam));
            return TRUE;
        }
        break;


    case WM_SIZE:
        InvalidateRect(hDlg, NULL, TRUE);
        return TRUE;

    case WM_CTLCOLORDLG:
        GetClientRect(hDlg, &rcDialog);
        //通过SetStretchBltMode的设置能使StretchBlt在缩放图像更加清晰
        SetStretchBltMode((HDC)wParam, COLORONCOLOR);
        StretchBlt((HDC)wParam, 0, 0, rcDialog.right, rcDialog.bottom, s_hdcMem, 0, 0, s_bm.bmWidth, s_bm.bmHeight, SRCCOPY);   
        return (BOOL)((HBRUSH)GetStockObject(NULL_BRUSH));
    }
    return FALSE;
}
接下来是我用汇编的代码,总是图片出不来
程序代码:
.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitive

include test.inc

.code

start:
    invoke    GetModuleHandle,NULL
    mov    hInstance,eax
    invoke    InitCommonControls
    invoke    DialogBoxParam,hInstance,IDD_MAIN,NULL,addr DlgProc,NULL
    invoke    ExitProcess,0

;########################################################################

DlgProc    proc    hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    LOCAL hdc:HDC
    LOCAL hdcSrc:HDC
    LOCAL PicH:DWORD
    LOCAL PicW:DWORD
    LOCAL rect:RECT
    LOCAL hRgn:HRGN
    LOCAL hbitmap:HBITMAP
    LOCAL sbmp:BITMAP
    LOCAL hpaint:PAINTSTRUCT
   
    mov    eax,uMsg
    .if    eax==WM_INITDIALOG
        invoke GetWindowLong,hWin, GWL_STYLE
        or eax,WS_SIZEBOX
        invoke SetWindowLong,hWin,GWL_STYLE,eax
        invoke LoadBitmap,hInstance,logo
        mov hbitmap,eax
        invoke GetDC,hWin
        mov hdc,eax
        invoke CreateCompatibleDC,hdc
        mov hdcSrc,eax
        invoke SelectObject,hdcSrc,hbitmap
        invoke GetObject,hbitmap,sizeof sbmp,addr sbmp
        invoke ReleaseDC,hWin,hdc
        ;initialization here
    .elseif eax==WM_CTLCOLORDLG
        invoke GetClientRect,hWin,addr rect
        invoke SetStretchBltMode,wParam,COLORONCOLOR
        invoke StretchBlt,wParam,0,0,rect.right,rect.bottom,hdcSrc,0,0,sbmp.bmWidth,sbmp.bmHeight,SRCCOPY
        invoke GetStockObject,NULL_BRUSH
;        ret
    .elseif    eax==WM_SIZE
        invoke InvalidateRect,hWin,NULL,TRUE
;        mov eax,TRUE
;        ret
    .elseif    eax==WM_COMMAND
        mov edx,wParam
        movzx eax,dx
        shr edx,16
        .if edx==BN_CLICKED
            .if eax==IDOK

            .elseif eax==IDCANCEL
                invoke    SendMessage,hWin,WM_CLOSE,NULL,NULL
            .endif
        .endif
    .elseif    eax==WM_CLOSE
        invoke    EndDialog,hWin,0
    .else
        mov    eax,FALSE
        ret
    .endif
    mov    eax,TRUE
    ret
DlgProc endp

end start
我把教程中的LoadImage换成了LoadBitmap为了使加载资源中的为图方便经调试WM_CTLCOLORDLG消息总是不会触发,但是用C语言的就正常,难道是偶滴RPWT,……
搜索更多相关主题的帖子: windows include 注册机 网上 想学 
2014-12-31 11:59
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:14 
我都忘光光了 建议你找Win32汇编版的看看

我感觉是不是初始化的代码有问题?挂调试器看看?
2014-12-31 16:24
A_new
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2014-7-15
收藏
得分:0 
多谢提醒,又仔细调试了一下,代码应该是没啥问题,WM_CTLCOLORDLG消息也可以进去,只是在调用gdi api StretchBlt的时候参数的数据总是赋的不对,可能是ide或者是编译器的问题吧再仔细看看,再去masm论坛发帖问一下看看是什么情况,也可能就是偶滴RPWT了
2015-01-01 18:51
A_new
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2014-7-15
收藏
得分:0 
又看了一下开始参数不对原来是局部变量的问题,局部变量在消息循环中不断被重新赋值,C中有static 关键字加在变量定义的地方就相当于全局变量了,只初始化一次,汇编中还不清楚是否有这样的语法,还望高手指教
LOCAL sbmp:BITMAP
把它放到全局变量就好了
.data?
sbmp         BITMAP<>
但是位图还是不显示,整了几天终于搞定了也给大家分享一下完整的吧radasm3.0的工程
asm.rar (13.61 KB)


[ 本帖最后由 A_new 于 2015-1-7 17:24 编辑 ]
2015-01-03 12:45
快速回复:客户区贴图的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.042836 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved