| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1867 人关注过本帖
标题:VC API常用函数简单例子大全分享下,顺便请大家帮忙解决下遇到的问题
只看楼主 加入收藏
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:6 
学习,接分。

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2012-05-02 23:35
恶人打劫
Rank: 2
等 级:论坛游民
帖 子:14
专家分:39
注 册:2011-5-17
收藏
得分:6 
支持楼主,mark
2012-05-03 00:17
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
回复 8楼 有容就大
源代码已放到帖子里,希望有兴趣的朋友可以运行下看看,里面附带程序运行方法;
2012-05-03 01:36
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
回复 10楼 beyondyf
b版太厉害了,哈哈,我的按钮不会消失了,在这一行代码
   hwnd=CreateWindow("sunxin2006","小窗口", //标题栏的名字;类名要跟上面注册的一样,不然出错
        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,10,20,900,820,NULL,NULL,hInstance,NULL);
中用 '|'把WS_CLIPCHILDREN 连接起来就可以了,(不加WS_OVERLAPPEDWINDOW 创建的窗口上就没有最大化,最小化和关闭按钮,在任务栏也不能右键选择关闭)原来这么简单,
下一个问题是:
点击按钮加载并显示相应的图片窗口拖动后那些显示出来的图片消失了,被重绘掉了该怎么解决呢?可以用一个函数把窗口内设定的一个或几个矩形区域变为有效区域,例如:ValidateRect(CRect(20,40,60,90));编译出现未定义的符号"CRect",这个是怎么定义,应该在什么地方使用呢?PAINT里面用的吗?如果有很多矩形区域比如例子里面的图片位置有10个,该怎么解决呢?
2012-05-03 01:59
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 13楼 小赵q1
下了 运行了下 很不错啊
你那个背景图中的数A 数B 和总数 还有数字边框是原来背景图都有的吗? 貌似没看到你创建静态编辑框。
初始的时候 点击A B按钮没反应。

梅尚程荀
马谭杨奚







                                                       
2012-05-03 09:42
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:25 
大至写了一下,不过只实现了加分按钮的,其它两个按钮没有写了。过程和加分差不多。
不需要创建windows时加WS_CLIPCHILDREN,也不会出现楼主说的那个移动Bug,最小化再最大化也没有问题。

程序代码:
/**
    例题需要实现的方面是:
        总分=0,数A=0,数B=0,点击加分按钮,变量总分=点击按钮的次数*10,总分的
    值用小图片显示出来,点击按钮A一次,数A+1,数A下面显示数A的值,总分-1,
    代表总分的图片变成-1后的值,点击按钮B一次,数B+1,数B下面显示数B的值,
    总分-1,代表总分的图片变成-1后的值;

 */

#include <windows.h>
#include <stdio.h>

//////////////////////////////////////////////////////////
#define jiafen    1
#define shuA    2
#define shuB    3

const LPSTR szClassName = "sunxin2006";
HINSTANCE hHandle    = 0;
HBITMAP hBack        = 0;
HDC hdc_buffer        = 0;
BITMAP bitmap, d_bitmap;
HBITMAP hDigital[10];

int total   = 0;
int digit_a = 0;
int digit_b = 0;

//////////////////////////////////////////////////////////
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void on_create(HWND);
void on_paint(HDC);
void on_close(HWND);
void on_mousemove(HWND, DWORD, DWORD);

void create_button(HWND parent, LPSTR text, int x, int y, 
                   int width, int height, int ctl_id);
void load_digital_bitmap(void);
void unload_digital_bitmap(void);

void go_jiafen(HWND);
HBITMAP get_digital(char digital);
//////////////////////////////////////////////////////////

//程序入口
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmdLine, int nShow)
{
    HWND hwnd;
    MSG msg;
    WNDCLASS wnd;
    HDC hdc_main;


    hHandle = hInst;

    memset(&wnd, 0, sizeof(wnd) );
    wnd.hCursor            = LoadCursor(NULL, IDC_ARROW);
    wnd.hInstance        = hInst;
    wnd.lpfnWndProc        = WndProc;
    wnd.lpszClassName    = szClassName;
    wnd.style            = CS_HREDRAW | CS_VREDRAW;
    wnd.hbrBackground    = (HBRUSH) GetStockObject(WHITE_BRUSH);

    if(! RegisterClass(&wnd) )
    {
        MessageBox(NULL, "Error RegisterClass", "Error", MB_OK);
        return -1;
    }

    hBack = (HBITMAP) LoadImage(NULL, "background.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    GetObject(hBack, sizeof(BITMAP), &bitmap);

    hwnd = CreateWindow(szClassName, 
                        "小窗口",
                        WS_OVERLAPPEDWINDOW,
                        10, 20, bitmap.bmWidth, bitmap.bmHeight,
                        0,
                        0,
                        hInst,
                        0);
    if( !hwnd )
    {
        MessageBox(NULL, "Error Create Windows", "Error", MB_OK);
        return -1;
    }

    hdc_main = GetDC(hwnd);
    hdc_buffer = CreateCompatibleDC(hdc_main);
    SelectObject(hdc_buffer, hBack);
    ReleaseDC(hwnd, hdc_main);


    ShowWindow(hwnd, nShow);
    UpdateWindow(hwnd);

    while( GetMessage(&msg , NULL, 0, 0) >0 )
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
}

//消息回调过程
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch(uMsg)
    {
        case WM_CREATE:
            on_create(hwnd);
            break;
        case WM_PAINT:
            HDC hdc;
            PAINTSTRUCT ps;
            hdc = BeginPaint(hwnd, &ps);
            on_paint(hdc);
            EndPaint(hwnd, &ps);
            break;
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_CLOSE:
            on_close(hwnd);
            break;
        case WM_COMMAND:
            switch(LOWORD(wParam))
            {
                case jiafen:
                    go_jiafen(hwnd);
                    break;
                case shuA:
                    break;
                case shuB:
                    break;
            }
            break;
        case WM_MOUSEMOVE:
            on_mousemove(hwnd, LOWORD(lParam), HIWORD(lParam));
            break;
        default:
            return DefWindowProc(hwnd, uMsg, wParam, lParam);
    }
    return 0;
}
////////////////////////////////////////////////////////////////////////////////////////
// 处理窗口消息
void on_create(HWND hwnd)
{
    create_button(hwnd, "加分", 556, 271, 49, 48, jiafen);
    create_button(hwnd, "钮A", 138, 269, 34, 40, shuA);
    create_button(hwnd, "钮B", 303, 269, 34, 40, shuB);
    load_digital_bitmap();
}

void on_close(HWND hwnd)
{
    if(IDYES == MessageBox(hwnd,"真的要退出吗?","小窗口标题", MB_YESNO) )
    {
        unload_digital_bitmap();
        DeleteDC(hdc_buffer);
        DeleteObject(hBack);
        DestroyWindow(hwnd); 
    }
}

void on_paint(HDC hdc)
{
    if(hdc_buffer)
    {
        BitBlt(hdc, 0, 0, bitmap.bmWidth, bitmap.bmHeight, hdc_buffer, 0, 0, SRCCOPY);
    }
}

void on_mousemove(HWND hwnd, DWORD x, DWORD y)
{
    char buf[50];

    sprintf(buf, "小窗口 x = %d, y = %d", x, y);
    SetWindowText(hwnd, buf);
}

////////////////////////////////////////////////////////////////////////////////////////////////
// 处理command中的按钮消息

void go_jiafen(HWND hwnd)
{
    int i, slen, base_x = 491, base_y = 181;
    char ibuf[20];
    HDC temp;

    total += 10;
    sprintf(ibuf, "%06d", total);
    slen = strlen(ibuf);

    //SelectObject(hdc_buffer, hBack);
    temp = CreateCompatibleDC(NULL);
    for(i = 0; i < slen; i++)
    {
        SelectObject(temp, get_digital(ibuf[i]) );
        BitBlt(hdc_buffer, 
            base_x + i * d_bitmap.bmWidth, base_y, 
            d_bitmap.bmWidth, d_bitmap.bmHeight,
            temp, 0, 0, SRCCOPY);
    }
    DeleteDC(temp);
    InvalidateRect(hwnd, NULL, FALSE);
}

HBITMAP get_digital(char digital)
{
    switch(digital)
    {
        case '0':
            return hDigital[0];
            break;
        case '1':
            return hDigital[1];
            break;
        case '2':
            return hDigital[2];
            break;
        case '3':
            return hDigital[3];
            break;
        case '4':
            return hDigital[4];
            break;
        case '5':
            return hDigital[5];
            break;
        case '6':
            return hDigital[6];
            break;
        case '7':
            return hDigital[7];
            break;
        case '8':
            return hDigital[8];
            break;
        case '9':
            return hDigital[9];
            break;
    }
    return 0;
}


////////////////////////////////////////////////////////////////////////////////////////////////


// 辅助函数
void create_button(HWND parent, LPSTR text, int x, int y, int width, int height, int ctl_id)
{
    CreateWindow("button",
                text,
                WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 
                x, y, width, height,
                parent,
                (HMENU) ctl_id,
                hHandle,
                0);
}

void load_digital_bitmap()
{
    char buf[20];
    int i;

    for(i = 0; i < 10; i++)
    {
        sprintf(buf, "%d.bmp", i);
        hDigital[i] = (HBITMAP) LoadImage(NULL, buf, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

        if( hDigital[i] == 0) 
            MessageBox(NULL, "load digital bmpfile error!", "error", MB_OK);
        else
            GetObject(hDigital[i], sizeof(BITMAP), &d_bitmap);
    }
}

void unload_digital_bitmap()
{
    int i;

    for(i = 0; i < 10; i++)
    {
        DeleteObject( hDigital[i] );
    }
}


另外说些题外话,看你的说明文件中那一堆操作,其实创建一个win32工程就可以解决的问题,如果使用资源文件定义Bmp图片,可以在程序中直接用更简单的LoadBitmap函数,如果你象偶这个程序一样使用外部bmp图片,才使用LoadImage函数。看你的原文,让偶产生了歧义,还以为你可画按钮。。。汗, 看到你的代码才明白你要把按钮放在题义上的标识位置,真是汗呀

[ 本帖最后由 hellovfp 于 2012-5-3 17:50 编辑 ]

我们都在路上。。。。。
2012-05-03 17:26
zjsxwc
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:1
帖 子:252
专家分:601
注 册:2011-1-20
收藏
得分:6 
接分。。。。。。。

The tools I recommended:
GUI: CSharp(VS), QT;    Core Code: Plain C (Tiny C Compiler);    Web: Python, JavaScript;    Android: Java;    Embedded System: ASM&C (Linux)
2012-05-03 17:36
小跳蚤
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:1
帖 子:437
专家分:1623
注 册:2011-4-9
收藏
得分:0 
回复 16楼 hellovfp
hellovfp大哥可不可以给我一份那个《windows编程自学手册》
2012-05-03 20:35
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
回复 15楼 有容就大
背景图片上的就是那样了,上面小数字的位置为了方便对齐我就把它们显示在背景图片上了,点击一次加分按钮就判断总分每一位对应的值并显示在上面了,其实总分是10的时候,上面显示的图片是000010.
初始化的时候点击按钮A和点击按钮B没有反应,因为只有总分不等于0的时候点按钮A和按钮B总分才会减1,总分为0的时候,按钮A的值是不可能为1的,所以点击没有反应
2012-05-03 21:16
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
回复 19楼 小赵q1
这样啊 很不错啊 我现在还不会加载背景图片呢 要向你这个程序学习。

帮我看看 我哪个
我已经解决了 窗口重绘的问题 但是闪烁的问题 又来了。

梅尚程荀
马谭杨奚







                                                       
2012-05-03 21:20
快速回复:VC API常用函数简单例子大全分享下,顺便请大家帮忙解决下遇到的问题
数据加载中...
 
   



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

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