关于c语言图形界面程序中bmp图片的显示问题

光羽隹 2017-09-06 10:32:34
课程设计里想试着往程序里加载一张bmp图片(也不一定就必须得是bmp格式),因为是第一次研究这些东西,下面是我按照教程弄出来的一段代码,不知道为什么,打开程序后程序就直接一直未响应状态了,也不加载图片,事先设计的右键弹出菜单也用不了了,大神们帮我看看我这代码哪里有问题好么,在下才学浅薄,实在是不知道哪里出现了问题
LRESULT WINAPI WinProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{

switch(Msg)
{
...
case WM_PAINT:
PAINTSTRUCT ps;
BeginPaint(hWnd, &ps);
hDC= ps.hdc;
hMemdc = CreateCompatibleDC(hDC);
bg = (HBITMAP)LoadImage(NULL, _T("1.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
SelectObject(hMemdc, bg);
BitBlt(hDC, 0, 0, rect.right, rect.bottom, hMemdc, 0, 0, SRCCOPY);
...
}
return DefWindowProc(hWnd,Msg,wParam,lParam);
...全文
355 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
光羽隹 2017-09-07
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
仅供参考:
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
HWND WINAPI GetConsoleWindow();
void HideTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = FALSE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
void ShowTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = TRUE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
int main() {
    HWND  hwnd;
    HDC   hdc;
    HFONT hfont;
    HBITMAP hbm;
    HDC hdcBits;
    BITMAP bm;

    system("color F0");
    system("cls");
    HideTheCursor();
    hwnd  = GetConsoleWindow();
    hdc   = GetDC(hwnd);
    hbm=LoadImage(0,"C:\\Windows\\Soap Bubbles.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
    if (hbm) {
        hdcBits = CreateCompatibleDC(hdc);
        GetObject (hbm, sizeof(BITMAP), &bm);
        SelectObject(hdcBits,hbm);
        BitBlt(hdc,200,10,bm.bmWidth, bm.bmHeight,hdcBits,0,0,SRCCOPY);
        DeleteDC(hdcBits);
        DeleteObject(hbm);
    }
    hfont = CreateFont(24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");
    SelectObject(hdc,hfont);
    SetTextColor(hdc,RGB(255,255,255));
    SetBkMode(hdc,TRANSPARENT);
    TextOut(hdc,210,30,"这个背景是泡泡",14);
    DeleteObject(hfont);
    ReleaseDC(hwnd,hdc);
    getch();
    system("color 07");
    system("cls");
    ShowTheCursor();
    return 0;
}
这个问题我解决了,但是如果我要调用的是资源里引入的bmp图片的话又该怎么办呢?
光羽隹 2017-09-07
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
仅供参考:
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
HWND WINAPI GetConsoleWindow();
void HideTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = FALSE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
void ShowTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = TRUE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
int main() {
    HWND  hwnd;
    HDC   hdc;
    HFONT hfont;
    HBITMAP hbm;
    HDC hdcBits;
    BITMAP bm;

    system("color F0");
    system("cls");
    HideTheCursor();
    hwnd  = GetConsoleWindow();
    hdc   = GetDC(hwnd);
    hbm=LoadImage(0,"C:\\Windows\\Soap Bubbles.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
    if (hbm) {
        hdcBits = CreateCompatibleDC(hdc);
        GetObject (hbm, sizeof(BITMAP), &bm);
        SelectObject(hdcBits,hbm);
        BitBlt(hdc,200,10,bm.bmWidth, bm.bmHeight,hdcBits,0,0,SRCCOPY);
        DeleteDC(hdcBits);
        DeleteObject(hbm);
    }
    hfont = CreateFont(24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");
    SelectObject(hdc,hfont);
    SetTextColor(hdc,RGB(255,255,255));
    SetBkMode(hdc,TRANSPARENT);
    TextOut(hdc,210,30,"这个背景是泡泡",14);
    DeleteObject(hfont);
    ReleaseDC(hwnd,hdc);
    getch();
    system("color 07");
    system("cls");
    ShowTheCursor();
    return 0;
}
老师还在么?
赵4老师 2017-09-07
  • 打赏
  • 举报
回复
百度搜相关关键字。
赵4老师 2017-09-06
  • 打赏
  • 举报
回复
仅供参考:
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
HWND WINAPI GetConsoleWindow();
void HideTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = FALSE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
void ShowTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = TRUE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
int main() {
    HWND  hwnd;
    HDC   hdc;
    HFONT hfont;
    HBITMAP hbm;
    HDC hdcBits;
    BITMAP bm;

    system("color F0");
    system("cls");
    HideTheCursor();
    hwnd  = GetConsoleWindow();
    hdc   = GetDC(hwnd);
    hbm=LoadImage(0,"C:\\Windows\\Soap Bubbles.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
    if (hbm) {
        hdcBits = CreateCompatibleDC(hdc);
        GetObject (hbm, sizeof(BITMAP), &bm);
        SelectObject(hdcBits,hbm);
        BitBlt(hdc,200,10,bm.bmWidth, bm.bmHeight,hdcBits,0,0,SRCCOPY);
        DeleteDC(hdcBits);
        DeleteObject(hbm);
    }
    hfont = CreateFont(24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");
    SelectObject(hdc,hfont);
    SetTextColor(hdc,RGB(255,255,255));
    SetBkMode(hdc,TRANSPARENT);
    TextOut(hdc,210,30,"这个背景是泡泡",14);
    DeleteObject(hfont);
    ReleaseDC(hwnd,hdc);
    getch();
    system("color 07");
    system("cls");
    ShowTheCursor();
    return 0;
}
光羽隹 2017-09-06
  • 打赏
  • 举报
回复
引用 1 楼 tk2003 的回复:
"打开程序后程序就直接一直未响应状态了" ---主程序卡住,陷入死循环了 这方面代码荒芜依旧,只能提这么点建议了
额,我的意思是我这个程序运行到bmp图形那一块才出现的问题,其余部分正常,因为我是刚加进去的这部分代码,加进去之前程序是能正常运作的
IT保安 2017-09-06
  • 打赏
  • 举报
回复
"打开程序后程序就直接一直未响应状态了" ---主程序卡住,陷入死循环了 这方面代码荒芜依旧,只能提这么点建议了
notEBfast 2017-09-06
  • 打赏
  • 举报
回复
引用 4 楼 hzy_76 的回复:
不懂,仅凭猜测,你调用了BeginPaint,却没有EndPaint,这是要出事的。
额,EndPaint在下面,我没写出来
notEBfast 2017-09-06
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
仅供参考:
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
HWND WINAPI GetConsoleWindow();
void HideTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = FALSE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
void ShowTheCursor() {
    CONSOLE_CURSOR_INFO cciCursor;
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {
        cciCursor.bVisible = TRUE;
        SetConsoleCursorInfo(hStdOut, &cciCursor);
    }
}
int main() {
    HWND  hwnd;
    HDC   hdc;
    HFONT hfont;
    HBITMAP hbm;
    HDC hdcBits;
    BITMAP bm;

    system("color F0");
    system("cls");
    HideTheCursor();
    hwnd  = GetConsoleWindow();
    hdc   = GetDC(hwnd);
    hbm=LoadImage(0,"C:\\Windows\\Soap Bubbles.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);
    if (hbm) {
        hdcBits = CreateCompatibleDC(hdc);
        GetObject (hbm, sizeof(BITMAP), &bm);
        SelectObject(hdcBits,hbm);
        BitBlt(hdc,200,10,bm.bmWidth, bm.bmHeight,hdcBits,0,0,SRCCOPY);
        DeleteDC(hdcBits);
        DeleteObject(hbm);
    }
    hfont = CreateFont(24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");
    SelectObject(hdc,hfont);
    SetTextColor(hdc,RGB(255,255,255));
    SetBkMode(hdc,TRANSPARENT);
    TextOut(hdc,210,30,"这个背景是泡泡",14);
    DeleteObject(hfont);
    ReleaseDC(hwnd,hdc);
    getch();
    system("color 07");
    system("cls");
    ShowTheCursor();
    return 0;
}
这个报错呀,error C2440: '=' : cannot convert from 'void *' to 'struct HBITMAP__ *'
老马何以识途 2017-09-06
  • 打赏
  • 举报
回复
不懂,仅凭猜测,你调用了BeginPaint,却没有EndPaint,这是要出事的。
资源下载链接为: https://pan.quark.cn/s/3d8e22c21839 在计算机编程领域,C语言因简洁、高效、性能强大而广受欢迎,但其图形界面开发对初学者而言较为复杂,因为C语言本身不支持图形库。而EasyX图形库的出现,为C语言图形编程带来了便捷。EasyX虽是为C++设计的轻量级图形库,但也能用于C语言。它提供了丰富的图形绘制函数,像画点、线、矩形、椭圆、字符串等,让开发者无需深入Windows API或GDI,就能轻松开发出图形界面应用程序。 本文深入剖析了一款基于EasyX图形库的C语言拼图游戏,探讨其设计与实现。在游戏开发,开发者借助EasyX库设置窗口属性,如大小、标题等,并利用其绘图功能绘制游戏背景、拼图区域、提示按钮等元素。游戏核心是图像处理,开发者要读取图片文件,将其切割成小块并随机排列形成拼图,EasyX的位图操作函数如LoadBitmap加载图片、DrawBitmap显示图片等发挥了关键作用。 游戏的交互性至关重要。玩家通过键盘或鼠标操作拼图块,这涉及事件处理机制。EasyX提供完整事件处理系统,GetKeyState检测键盘输入,GetMouseState获取鼠标状态,开发者据此判断玩家操作并响应,如移动拼图块。为提升游戏趣味性,通常会设置时间限制、难度级别等。这需额外逻辑控制,如计时器函数,以及调整难度的算法,这些在C语言可通过基本数据结构和控制流程语句实现。 文提到的“Picture_20180304”可能是游戏背景或拼图源文件,开发者会将图片BMP、JPEG等格式保存,运行时加载。基于EasyX的C语言拼图游戏,融合了C语言底层控制力与EasyX图形能力,创造出视觉与交互兼具的应用。它既锻炼编程技巧,又助初学者理解图形界面编程概念与流程,是学习C语言和图形编程的优质实践项目。

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧