質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1588閲覧

C言語 高画質のアイコンを表示できない

A_.1

総合スコア6

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2021/09/07 04:03

編集2021/09/07 11:30

私はDrawIconExでアイコンを表示させたのですが、画質がとても悪すぎます。

C

1#include <windows.h> 2 3LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { 4 HDC hdc; 5 PAINTSTRUCT ps; 6 static HICON hIcon; 7 switch(msg) { 8 case WM_DESTROY: 9 PostQuitMessage(0); 10 return 0; 11 case WM_CREATE: 12 hIcon = LoadIcon(((LPCREATESTRUCT)(lp))->hInstance,TEXT("icon1")); 13 return 0; 14 case WM_PAINT: 15 hdc = BeginPaint(hwnd,&ps); 16 DrawIconEx(hdc,10,10,hIcon,500,500,0,0,DI_NORMAL); 17 EndPaint(hwnd,&ps); 18 } 19 return DefWindowProc(hwnd , msg , wp , lp); 20} 21 22int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , 23 PSTR lpCmdLine , int nCmdShow ) { 24 HWND hwnd; 25 HBRUSH hBrush = CreateSolidBrush(RGB(255,255,255)); 26 WNDCLASS winc; 27 MSG msg; 28 winc.style = CS_HREDRAW | CS_VREDRAW; 29 winc.lpfnWndProc = WndProc; 30 winc.cbClsExtra = winc.cbWndExtra = 0; 31 winc.hInstance = hInstance; 32 winc.hIcon = LoadIcon(hInstance,TEXT("icon1")); 33 winc.hCursor = LoadCursor(NULL , IDC_ARROW); 34 winc.hbrBackground = hBrush; 35 winc.lpszMenuName = NULL; 36 winc.lpszClassName = TEXT("test"); 37 38 if (!RegisterClass(&winc)) return 0; 39 40 hwnd = CreateWindow( 41 TEXT("test") , TEXT("icon") , 42 WS_OVERLAPPEDWINDOW | WS_VISIBLE , 43 CW_USEDEFAULT , CW_USEDEFAULT , 44 CW_USEDEFAULT , CW_USEDEFAULT , 45 NULL , NULL , 46 hInstance , NULL 47 ); 48 49 if (hwnd == NULL) return 0; 50 51 while (GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg); 52 return msg.wParam; 53}

なにか解決策がないか教えてほしいです。

環境は、MinGW-win32でコンパイル方法は、gcc -mwindows test.c test.oです。

表示させたい画像
画像

でも実行すると、
画像
こうなります。

試したこと
BITMAPを使おうと思いましたが、なぜか画像が表示されません。

リソーススクリプト

image.rc

1icon1 BITMAP "R.bmp"

C

1#include <windows.h> 2 3LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) { 4 HDC hdc , hBuffer; 5 PAINTSTRUCT ps; 6 static HBITMAP hBitmap; 7 8 switch (msg) { 9 case WM_DESTROY: 10 DeleteObject(hBitmap); 11 PostQuitMessage(0); 12 return 0; 13 case WM_CREATE: 14 hBitmap = LoadBitmap( 15 ((LPCREATESTRUCT)lp)->hInstance , 16 TEXT("icon1") 17 ); 18 return 0; 19 case WM_PAINT: 20 hdc = BeginPaint(hwnd , &ps); 21 hBuffer = CreateCompatibleDC(hdc); 22 SelectObject(hBuffer , hBitmap); 23 24 BitBlt(hdc , 0 , 0 , 500 , 500 , hBuffer , 500 , 500 , SRCCOPY); 25 26 DeleteDC(hBuffer); 27 EndPaint(hwnd , &ps); 28 return 0; 29 } 30 return DefWindowProc(hwnd , msg , wp , lp); 31} 32 33int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , 34 PSTR lpCmdLine , int nCmdShow ) { 35 HWND hwnd; 36 MSG msg; 37 WNDCLASS winc; 38 39 winc.style = CS_HREDRAW | CS_VREDRAW; 40 winc.lpfnWndProc = WndProc; 41 winc.cbClsExtra = winc.cbWndExtra = 0; 42 winc.hInstance = hInstance; 43 winc.hIcon = LoadIcon(NULL , IDI_APPLICATION); 44 winc.hCursor = LoadCursor(NULL , IDC_ARROW); 45 winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); 46 winc.lpszMenuName = NULL; 47 winc.lpszClassName = TEXT("test"); 48 49 if (!RegisterClass(&winc)) return -1; 50 51 hwnd = CreateWindow( 52 TEXT("test") , TEXT("icon") , 53 WS_OVERLAPPEDWINDOW | WS_VISIBLE , 54 CW_USEDEFAULT , CW_USEDEFAULT , 55 CW_USEDEFAULT , CW_USEDEFAULT , 56 NULL , NULL , 57 hInstance , NULL 58 ); 59 60 if (hwnd == NULL) return -1; 61 62 while(GetMessage(&msg , NULL , 0 , 0)) { 63 TranslateMessage(&msg); 64 DispatchMessage(&msg); 65 } 66 return msg.wParam; 67}

そして、DrawIconExを使わずDrawIconを使い、あとでStretchBltで拡大しようとしましたが、
画質が悪いまま。

ほかにも方法がないか調べましたが、なにもありません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/09/07 05:43 編集

> 私はDrawTextExでアイコンを表示させたのですが、画質がとても悪すぎます。 DrawIconExでは? 画質が悪いだけだと、他の人にはどういう状態かさっぱり判らないので、実際に設定したアイコンの画像と表示される画像のスクリーンショットでも貼り付けてください。 [質問するときのヒント] https://teratail.com/help/question-tips
guest

回答2

0

ベストアンサー

LoadIconW function (winuser.h)

Note This function has been superseded by the LoadImage function.

APIリファレンスには、LoadImageに置き換えられたとありますね。
LoadIconは使わない方が良いでしょう。

リソース作るの面倒なので、LoadImageで提示画像をicoの最大サイズ256x256にしたicoファイルを読み込んだ結果です。

c++

1LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { 2 HDC hdc; 3 PAINTSTRUCT ps; 4 static HICON hIcon; 5 6 switch (msg) { 7 case WM_DESTROY: 8 DestroyIcon(hIcon); 9 PostQuitMessage(0); 10 return 0; 11 case WM_CREATE: 12 hIcon = (HICON)LoadImage(NULL, L"c:\test\test.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE); 13 return 0; 14 case WM_PAINT: 15 hdc = BeginPaint(hwnd, &ps); 16 DrawIconEx(hdc, 0, 0, hIcon, 0, 0, 0, NULL, DI_NORMAL); 17 EndPaint(hwnd, &ps); 18 return 0; 19 } 20 return DefWindowProc(hwnd, msg, wp, lp); 21}

プレビュー

投稿2021/09/07 13:04

編集2021/09/07 14:25
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

A_.1

2021/09/08 04:16

LoadIconをLoadImageにすることでできましたが、 リソーススクリプトでやる方法はありますか? 私は、 リソーススクリプト icon1 ICON "R.ico" hIcon = LoadImage( ((LPCREATESTRUCT)(lp))->hInstance,TEXT("icon1"),IMAGE_ICON,0,0,LR_LOADFROMFILE ); とやったのですが、表示されません。 どうすれまいいでしょう?
A_.1

2021/09/08 04:18

DrawIconExの方は DrawIconEx(hdc,256,256,hIcon,256,256,0,NULL,DI_NORMAL); です。
退会済みユーザー

退会済みユーザー

2021/09/08 04:24 編集

きちんとLoadImageのAPIリファレンスを読んでください。 LR_LOADFROMFILEはファイルから読む場合の指定です。
A_.1

2021/09/08 05:03

すみません。
A_.1

2021/09/08 05:05

hIcon = LoadImage( ((LPCREATESTRUCT)(lp))->hInstance,TEXT("icon1"),IMAGE_ICON,0,0,LR_DEFAULTCOLOR ); でできました
guest

0

LoadIconで読み込んでいるからだと思います。

LoadIcon can only load an icon whose size conforms to the SM_CXICON and SM_CYICON system metric values. Use the LoadImage function to load icons of other sizes.

LoadIconW function

投稿2021/09/07 05:48

ishina_yum

総合スコア509

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問