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

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

ただいまの
回答率

90.52%

  • C++

    3448questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1831questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Win32 API

    222questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

ウィンドウの異常な表示を修正したい

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 521

Y.K_CDB

score 2

前提・実現したいこと

win32API+VS2015を用いてローカルネットワークサーバーへログインする簡易なGUIを作りたい。
プログラミング初心者

発生している問題・エラーメッセージ

ウィンドウの縁や最上段のウィンドウ名が表示されない。

該当のソースコード

#include <iostream>
#include <string>
#include <fstream>
#include <windows.h>                   //WINAPIヘッダ
#include <windowsx.h>
#pragma comment(lib, "user32.lib")     //必須ライブラリ1
#pragma comment(lib, "gdi32.lib")      //必須ライブラリ2

//定義
#define NAME "Section1.2 window base"  //タイトルバーに表示するテキスト
#define WND_WIDTH  301                 //ウィンドウのx
#define WND_WEIGHT 239              //ウィンドウのy
#define FONTPIX   11            //フォントサイズ

using namespace std;

//グローバル変数
RECT recDisplay, recWindow, recClient;
WNDPROC DefStaticProc;
HBRUSH hBkColor;
BOOL bCap = FALSE;

//関数プロトタイプ宣言
LRESULT CALLBACK StaticProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);

//Windws イベント用関数
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {

    char cStr[256];
    char *sp = "                         ";
    LONG lMouseX = WND_WIDTH - 140, lMouseY = WND_WEIGHT - 60;    //座標表示場所指定
    //メインフォント定義
    HDC hdc = GetDC(hWnd);
    int FontW = MulDiv(FONTPIX, GetDeviceCaps(hdc, LOGPIXELSX), 72);
    ReleaseDC(hWnd, hdc);
    HFONT hFont = CreateFont(FontW * -1,
        0,
        0,
        0,
        FW_NORMAL,
        FALSE,
        FALSE,
        FALSE,
        SHIFTJIS_CHARSET,
        OUT_DEFAULT_PRECIS,
        CLIP_DEFAULT_PRECIS,
        DEFAULT_QUALITY,
        VARIABLE_PITCH | FF_DONTCARE,
        TEXT("MS UI Gothic"));
    LPCTSTR strName = TEXT("なまえ");
    TCHAR str[255];
    PAINTSTRUCT ps;
    POINT pPoint;
    int n = NULL;
    HWND hComboboxName = NULL,
        hEditPass = NULL,
        hButtonLogin = NULL,
        hButtonHomeLogin = NULL,
        hButtonLogout = NULL;

    //渡された message から、イベントの種類を解析する
    switch (msg) {

        //ウィンドウ表示終了判定
        case WM_DESTROY:
            DeleteObject(hBkColor);
            PostQuitMessage(0);
            return 0;

        //キー判定
        case WM_KEYDOWN:
            switch (wParam) {
                case VK_RETURN:    //リターンキー判定
                    DeleteObject(hBkColor);
                    PostQuitMessage(0);    //終了処理
                    return 0;
            }
            return 0;

        //カーソル移動判定
        case WM_MOUSEMOVE: {
            //カーソル座標表示を描画指示する
            RECT rect = { lMouseX, lMouseY, lMouseX + 120, lMouseY + 20 };
            InvalidateRect(hWnd, &rect, false);
            return 0;
        }

        //描画処理
        case WM_PAINT: {
            HDC hdc = BeginPaint(hWnd, &ps);    //描画開始

            //デバッグ用カーソル座標表示
            GetCursorPos(&pPoint);                //カーソル座標取得    
            ScreenToClient(hWnd, &pPoint);        //ウィンドウ座標に変換
            sprintf_s(cStr, "x = %3d, y = %3d", pPoint.x, pPoint.y);    //文字列化
            FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW));        //ウィンドウ初期化
            TextOut(hdc, lMouseX, lMouseY, cStr, lstrlen(cStr));        //座標表示

            EndPaint(hWnd, &ps);        //描画終了
            return 0;
        }
                   //ウィンドウ作成判定
        case WM_CREATE: {
            //名前一覧コンボボックス作成
            hComboboxName = CreateWindow(TEXT("COMBOBOX"),
                TEXT("なまえ"),
                WS_CHILD | WS_VISIBLE | WS_TABSTOP | CBS_DROPDOWNLIST,
                38, 42, //x,y座標
                210, FontW + 1, //幅,高さ
                hWnd,
                (HMENU)1,
                ((LPCREATESTRUCT)(lParam))->hInstance,
                NULL);

            //パスワード入力フォーム作成
            hEditPass = CreateWindowEx(WS_EX_CLIENTEDGE,
                TEXT("EDIT"),
                NULL,
                WS_CHILD | WS_VISIBLE | WS_TABSTOP | ES_LEFT | ES_PASSWORD,
                38, 90, //x,y座標
                210, FontW + 8, //幅,高さ
                hWnd,
                NULL,
                ((LPCREATESTRUCT)(lParam))->hInstance,
                NULL);
            DefStaticProc = (WNDPROC)GetWindowLong(hEditPass, GWL_WNDPROC);
            SetWindowLong(hEditPass, GWL_WNDPROC, (LONG)StaticProc);

            //ボタンフォーム作成
            hButtonLogin = CreateWindow(TEXT("BUTTON"),
                TEXT("Action !!"),
                WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,
                38, 133,
                66, FontW + 8,
                hWnd,
                NULL,
                ((LPCREATESTRUCT)(lParam))->hInstance,
                NULL);

            hButtonHomeLogin = CreateWindow(TEXT("BUTTON"),
                TEXT("*押すな*"),
                WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,
                38 + 72, 133,
                66, FontW + 8,
                hWnd,
                NULL,
                ((LPCREATESTRUCT)(lParam))->hInstance,
                NULL);

            hButtonLogout = CreateWindow(TEXT("BUTTON"),
                TEXT("Reset"),
                WS_CHILD | WS_VISIBLE | WS_TABSTOP | BS_PUSHBUTTON,
                38 + 72 + 72, 133,
                66, FontW + 8,
                hWnd,
                NULL,
                ((LPCREATESTRUCT)(lParam))->hInstance,
                NULL);

            //フォームフォント設定
            SetWindowFont(hComboboxName, hFont, TRUE);
            SetWindowFont(hEditPass, hFont, TRUE);
            SetWindowFont(hButtonLogin, hFont, TRUE);
            SetWindowFont(hButtonHomeLogin, hFont, TRUE);
            SetWindowFont(hButtonLogout, hFont, TRUE);

            //背景処理
            HDC hdc = GetDC(hWnd);
            SetBkMode(hdc, TRANSPARENT);
            ReleaseDC(hWnd, hdc);

            return 0;
        }

    //その他
    return DefWindowProc(hWnd, msg, wParam, lParam);

    }
}
//右クリック防止関数
LRESULT CALLBACK StaticProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    switch (msg) {
    case WM_CONTEXTMENU:
        return 0;

    default:
        CallWindowProc(DefStaticProc, hWnd, msg, wParam, lParam);
    }

}

//Windows Main 関数
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
    HWND hWnd, hDeskWnd;
    MSG msg;

    hBkColor = CreateSolidBrush(RGB(0xF0, 0xF0, 0xF0));
    // Set up and register window class
    WNDCLASS wc = {CS_CLASSDC,
                   WndProc,                                //イベントcallback関数
                   0,
                   0,
                   hInstance,
                   NULL, //アイコン
                   LoadCursor( NULL, IDC_ARROW ),          //マウスカーソル
                   hBkColor, //背景色
                   NULL,                                   //メニュー
                   NAME};                                 //クラス名
    if(RegisterClass(&wc) == 0) return FALSE;

    hDeskWnd = GetDesktopWindow();
    GetWindowRect(hDeskWnd, &recDisplay);
    //ウインドウ生成
    hWnd = CreateWindow(NAME,                  //タイトルバーテキスト
                        NAME,                  //クラス名
                        WS_OVERLAPPEDWINDOW | WS_VISIBLE,   //ウインドウスタイル
                        75/* (recDisplay.right - WND_WIDTH) */,         //ウインドウ左上x座標
                        60/* (recDisplay.bottom - WND_WWIGHT) */,         //ウインドウ左上y座標
                        WND_WIDTH,         //ウインドウ幅
                        WND_WEIGHT,         //ウインドウ高さ
                        NULL,                  //親ウインドウのハンドル
                        NULL,
                        hInstance,
                        NULL);
    if(!hWnd) return FALSE;

    ShowWindow(hWnd, nCmdShow);     //Window を表示
    UpdateWindow(hWnd);             //表示を初期化
    SetFocus(hWnd);                 //フォーカスを設定

    while(GetMessage(&msg, NULL, 0, 0)){
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}

補足情報(言語/FW/ツール等のバージョンなど)

win10(64bit)
VisualStudio Communityで作成

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

WndProc()内の最後のreturnswitch文の中に入ってしまっています。
switch文の外に出すか、default:returnの前に追加することで無事表示されました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/03 02:49

    仰ったとおりにするとあっさり治りました
    この度はありがとうがざいました。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C++

    3448questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1831questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • Win32 API

    222questions

    Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。