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

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

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

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

Q&A

解決済

2回答

940閲覧

ウィンドウのアイコンの画質が悪い

A_.1

総合スコア6

C

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

0グッド

0クリップ

投稿2021/09/12 01:13

編集2021/09/25 02:30

ウィンドウのアイコンの画質がとても悪いです。
イメージ説明
イメージ説明

C

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

試したこと
アイコンのサイズを32x32で画質を最大限あげてみましたが、少し良くなっただけで画質はまだ悪い。
LoadIconでやっても効果なし。
LoadImageのLR_DEFAULTCOLORをLR_DEFAULTSIZEにかえても効果なし。
私がいれてるゲームのアイコンを使ってみるも効果なし(ゲームのアイコンはとてもいいです。)

なにか方法があるなら教えてください。

追記
いろいろ調べた結果、
ウィンドウを高DPI化することで、多分ウィンドウのアイコンを高画質化することがわかりました。
http://yamatyuu.net/computer/program/sdk/win/messagebox/index.html
こちらからダウンロードしたのが、こちら↓
イメージ説明
高DPI化してないメッセージボックスは↓
イメージ説明
これでできると思いましたが、MinGW-Win64だとエラーが出て、コンパイラできません。
それで、ソースコードに

C

1#include <shellscalingapi.h>

があることに気づきました。
これを調べた結果DPIを取得などをできるようですが、MinGW-Win64ではインクルードできないようです。
どうすれば、高DPI化できるのでしょうか?
MinGW-Win64ではなく、他のを使うべきでしょうか?

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

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

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

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

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

dodox86

2021/09/12 01:17

こちらの質問回答で解決できたのではなかったのですか? [C言語 高画質のアイコンを表示できない] https://teratail.com/questions/358148 ※なぜまた同じような質問が出るのか?と思ってしまいます。
dodox86

2021/09/12 01:55 編集

WindowsのICOファイルは、通常、アイコンを描画しようとするシーンに応じて複数の解像度のアイコン画像を収めています。ウィンドウのタイトルバー左端やタスクバーに表示されるとき、フォルダーの一覧に表示されるときなど、適切なものが自動で選択されます。自力でコードで描画しようとするときは、その辺りの意識も必要なはずです。また、ゲームのアイコンとやらも、そのゲームのプログラムがWin32ネイティブアプリ(<質問者さんのコード)とは限らず、自力で高解像度対応の描画をしているかもしれません。
退会済みユーザー

退会済みユーザー

2021/09/12 02:13 編集

フリーソフト等で、一枚絵から複数のサイズのビットマップを格納したicoファイルを生成してくれるものなどもあるので、そういったものを使えば多少はマシになるのでは。 適切なサイズのビットマップがicoファイルに見つからない場合、勝手に低品質な拡大・縮小を行うので画質は悪くなります。
guest

回答2

0

高DPIサポートしたいのであれば、マニフェストファイルを追加するか、APIを呼び出します。Microsoftは、マニフェストファイルによる方法を推奨しています。
MinGWで正しく動くかは知りません。
PC で高 DPI ディスプレイをサポートする
WindowsのDPIスケーリング処理について一考察

MinGW-Win64ではなく、他のを使うべきでしょうか?

今時は、GUI作るならC#使う方が多いんじゃないですか?
仮にC++で作るにしても、開発効率悪いので何らかのライブラリやフレームワークを使用するんじゃないかと。

投稿2021/09/27 00:49

編集2021/09/27 01:00
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

A_.1

2021/10/02 22:01

C#使ってみました。 開発効率がC言語よりはるかに良いのと、高DPI対応アプリケーションを作成してくれるので、 最高です。これからはC#を使う事にします。
guest

0

自己解決

アプリケーションを右クリックしてプロパティを開いて、互換性を開いて高DPI設定の変更をクリックして、
"高DPIスケールの動作を上書きします。"
のところにチェックをいれて適応をおせば解決しました。
https://novlog.me/win/win10-dpi-high/

変更する前
イメージ説明

変更した後
イメージ説明

投稿2021/09/26 05:28

A_.1

総合スコア6

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

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

退会済みユーザー

退会済みユーザー

2021/09/27 00:39 編集

それやっても、自分のPCだけにしか適用されないと思うんですけど。使う人みんなに設定変更して貰うんですか?
A_.1

2021/09/27 09:08

そうなんですか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問