子ウィンドウの中にエディットコントロールが表示されない

解決


hiroki  2007-03-14 02:20:45  No: 64647  IP: 192.*.*.*

子ウィンドウを作りその中にエディットコントローラーとスピンボタンを作成したいのですがエディットコントローラーのほうが表示されません。
CreateWindowも成功しています。
環境は、VC2005+WinXP  です。

        //子ウィンドウです
  LPCSTR szClassName = TEXT("COPController");
  WNDCLASS op; 
  op.style = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE; 
  op.lpfnWndProc = OPProc; //プロシージャ名 
  op.cbClsExtra = 0; 
  op.cbWndExtra = 0; 
  op.hInstance = hInst; //インスタンス 
  op.hIcon = LoadIcon(NULL, IDI_APPLICATION); 
  op.hCursor = LoadCursor(NULL, IDC_ARROW); 
  op.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); 
  op.lpszMenuName = NULL; //メニュー名 
  op.lpszClassName = szClassName; 
  if(!RegisterClass(&op)){
    return FALSE;
  }
  m_ophWnd = CreateWindow(szClassName, TEXT(""),
          WS_CHILD | WS_DLGFRAME |                                               WS_CAPTION | WS_CLIPCHILDREN,
          ix,iy,iwidth,iheight,
          hwnd,(HMENU)id,hInst,NULL);
  ShowWindow(m_ophWnd, SW_SHOW);
  UpdateWindow(m_ophWnd);

        //以下がエディットコントロールとスピンボタンです
        //上の子ウィンドウのWM_CREATEで呼び出しています。
  INITCOMMONCONTROLSEX ic;
  ic.dwSize = sizeof(INITCOMMONCONTROLSEX);
  ic.dwICC  = ICC_UPDOWN_CLASS;
  InitCommonControlsEx(&ic);

  edhWnd = CreateWindowEx( 0, "Edit", "", WS_CHILD | WS_VISIBLE |                 WS_BORDER | WS_CLIPSIBLINGS,
    rect->left, rect->top, rect->right - rect->left,                       rect->bottom - rect->top,
    hWnd, (HMENU)eid, hInst, NULL);

  sbhWnd = CreateUpDownControl(WS_CHILD | WS_VISIBLE | WS_BORDER                 | UDS_ALIGNRIGHT | WS_CLIPSIBLINGS,
    0,0,0,0, hWnd, sid, hInst, edhWnd, max, min, 1);

  if( !edhWnd || !sbhWnd)
    return FALSE;

  SetWindowText(edhWnd, "001");

編集 削除
Blue  2007-03-14 08:44:17  No: 64648  IP: 192.*.*.*

>rect
はどのようにして取得しているのでしょうか?



本題と関係ないですが、ソースの前半部分は TEXT マクロを使っているのに
後半は使っていません。TEXT マクロを使うように統一したほうがいいでしょう。

>edhWnd = CreateWindowEx( 0, "Edit", "", 
edhWnd = CreateWindowEx( 0, TEXT("Edit"), TEXT(""), 

>SetWindowText(edhWnd, "001");
SetWindowText(edhWnd, TEXT("001"));

編集 削除
hiroki  2007-03-14 18:17:22  No: 64649  IP: 192.*.*.*

>本題と関係ないですが、ソースの前半部分は TEXT マクロを使っているのに
>後半は使っていません。TEXT マクロを使うように統一したほうがいいでしょ
>う。

ご指摘ありがとうございます、これからは気をつけます。

rectは、
#define ID_EDIT_X 101
#define ID_SPIN_X 201

#define X_X 10
#define X_Y 10

#define MAX_NUM 1000
#define MIN_NUM -1000

#define SPINEDHIT_W 100
#define SPINEDHIT_H 60

RECT m_recx;
m_recx.right  = X_X;
m_recx.top    = X_Y;
m_recx.left   = X_X + SPINEDHIT_W;
m_recx.bottom = X_Y + SPINEDHIT_H;

case WM_CREATE:
HINSTANCE hInst = ((LPCREATESTRUCT)lp)->hInstance;
 XSpinEdit.Init(hWnd, hInst, &m_recx, ID_EDIT_X, ID_SPIN_X, MAX_NUM, MIN_NUM);

と、しています。

編集 削除
hiroki  2007-03-14 19:38:18  No: 64650  IP: 192.*.*.*

すいません書き忘れです。
// XSpinEdit.Init(,, RECT *rc ,,)の処理です。
RECT rect = *rc;

edhWnd = CreateWindowEx( 0, "Edit", "", WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPSIBLINGS,
rect->left, rect->top, rect->right - rect->left,                       rect->bottom - rect->top,
hWnd, (HMENU)eid, hInst, NULL);

編集 削除
Blue  2007-03-14 21:11:59  No: 64651  IP: 192.*.*.*

本当にコンパイル出来ていますか?

>RECT rect = *rc;
>rect->left, rect->top, rect->right - rect->left, rect->bottom - rect->top,

rectはRECT型の変数ですよね?
->は使わないのでは?
->をつかうならrcに対してですよね?

編集 削除
hiroki  2007-03-14 22:03:33  No: 64652  IP: 192.*.*.*

すいませんちょっとまちがえてて、
RECT rect = *rc;
rc->left, rc->top, rc->right - rc->left, rc->bottom - rc->top,
でした。
rectを使うように直しておきます。

RECTでちゃんと範囲をしていできていなかったため、表示されていませんでした。
>m_recx.right  = X_X;
>m_recx.top    = X_Y;
>m_recx.left   = X_X + SPINEDHIT_W;
>m_recx.bottom = X_Y + SPINEDHIT_H;
の右と左の数値が反対でした。
スピンボタンは正しいいちに表示されているため、エディットコントロールの
表示部分に問題あると思って、気づきませんでした。

わざわざお時間をとらせてしまって、申し訳ありません。
以後このようなことの無い様に気をつけます。

編集 削除