タイトルバーなしのウィンドウの作成方法は? – 固定ページ 2 – プログラミング – Home

タイトルバーなしのウィンドウの作成方法...
 
通知
すべてクリア

[解決済] タイトルバーなしのウィンドウの作成方法は?

固定ページ 2 / 3

MK
 MK
(@MK)
ゲスト
結合: 25年前
投稿: 66
 

sugarさん 回答ありがとうございます。

実は最初のほうでsugarさんに教えていただいた方法のみまだTRYしていません。
せっかく詳細ということで教えていただいたのですが、私には少しまだ難しそうで
すぐには手を付けれません。

で、今回のアドバイスはすでに実行済みで目的が達成できることは確認しました。
しかしながら、ダイアログベースであればプロパティをいじるだけで簡単に達成できて
しまします。メインウィンドウは出来ないではちょっと悔しいです。

今もネット上を探していましたが、同様な質問はいくつかあるのですが、解決にいたった
サイトは有りませんでした。また、解決案はここを見よという回答はありましたが、リンク先
が消えていました。

分かる人お願いします。


返信引用
Shimura
 Shimura
(@Shimura)
ゲスト
結合: 22年前
投稿: 36
 

>メインウィンドウは出来ないではちょっと悔しいです。
できるよ。

>良く見ると画面の周りにフレームらしきものが残っていました。
CMainFrame::PreCreateWindow() のなかで、CFrameWnd::PreCreateWindow() を呼び出し
てるでしょ?
その場合は、

cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

も追加しなくちゃダメです。理由は、CFrameWnd::PreCreateWindow() の定義を見れば
イッパツ。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

ビューのほうの WS_EX_CLIENTEDGE もはずさないと駄目ですよ。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

> ビューのほうの WS_EX_CLIENTEDGE もはずさないと駄目ですよ。

ごめんなさい。
私がイメージしてたのは MK が考えてるのとはちょっと違うかも。


返信引用
Shimura
 Shimura
(@Shimura)
ゲスト
結合: 22年前
投稿: 36
 

>で、今回のアドバイスはすでに実行済みで目的が達成できることは確認しました。
>しかしながら、ダイアログベースであればプロパティをいじるだけで簡単に達成できて
>しまします。メインウィンドウは出来ないではちょっと悔しいです。

補足というか、何というか。
MFC を使ってるんなら、MFC が内部で何をやってるのかも探ってみなきゃダメです。
簡単なエディタならものの5分で作れちゃうのが MFC だけど、逆に変化球を打とうとす
れば一筋縄でいかないのも MFC です。
試しに、今作ってるアプリケーションを MFC を使わずに書いてみてごらん。
そうすれば、MFC の良さも MFC の悪さも、便利な点も不都合な点も、いろいろと
見えてくるハズです。

そして再度 MFC に戻ってみると、ダイアログベースにかかわらず
「簡単に達成できてしまう」と感じるコトでしょう。:-)


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

たびたびすんません。
「真っ白いクライアント領域をデスクトップ一杯の大きさに」
したいならやっぱり、
「ビューのほうの WS_EX_CLIENTEDGE もはずさないと」いけません。

# 先ほどの書き込みで MK さんの名前に敬称を付けるのを忘れていました。
# ごめんなさい。


返信引用
Shimura
 Shimura
(@Shimura)
ゲスト
結合: 22年前
投稿: 36
 

>ビューのほうの WS_EX_CLIENTEDGE もはずさないと駄目ですよ。
ビューのぼうもいじってるとすれば、ハズすべきは WS_EX_CLIENTEDGE ではなく
WS_BORDER ですな。


返信引用
kazuma
 kazuma
(@kazuma)
ゲスト
結合: 24年前
投稿: 217
 

> >ビューのほうの WS_EX_CLIENTEDGE もはずさないと駄目ですよ。
> ビューのぼうもいじってるとすれば、ハズすべきは WS_EX_CLIENTEDGE ではなく
> WS_BORDER ですな。

ほんとだ、
PreCreateWindow でやるときは WS_BORDER をはずさないと駄目みたいですね。
(CView::PreCreateWindow で何やらやっている。)

後からやるときは WS_EX_CLIENTEDGE をはずせば OK です。


返信引用
MK
 MK
(@MK)
ゲスト
結合: 25年前
投稿: 66
 

皆さんおはようございます。今日も朝5:00からがんばっています。
またまた回答を頂き、やった~と大喜びでTRYしたのも束の間、出来ませんでした。

大変ご迷惑をおかけします。
また、厳しいVCのQ&Aの世界で親切且つ罵倒せずにこれまで回答頂き有難うございます。

そろそろ諦めようかとも思いましたが、最後に恥をしのんでもう一度質問させてください。

<Shimura 2003/02/28(金) 23:39:59>

>>メインウィンドウは出来ないではちょっと悔しいです。
>できるよ。
そうですよね。出来なきゃ詐欺だ。

>>良く見ると画面の周りにフレームらしきものが残っていました。
正確にはフレームでは無くクライアント領域の3Dのエッジだと思います??

>CMainFrame::PreCreateWindow() のなかで、CFrameWnd::PreCreateWindow() を呼び出し
>てるでしょ?その場合は、
すみません。まだ会話についていけるだけの力がありません。
↓これのことでしょうか?
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;

>cs.dwExStyle &= ~WS_EX_CLIENTEDGE;も追加しなくちゃダメです。
以下のように追加しましたが、だめでした。追加の仕方が変?

  cs.style = WS_POPUP;
  cs.dwExStyle &= ~WS_EX_CLIENTEDGE; <---■追加しました
cs.x = cs.y = 0;
cs.cx = 100;//::GetSystemMetrics( SM_CXSCREEN);
cs.cy = ::GetSystemMetrics( SM_CYSCREEN);

>理由は、CFrameWnd::PreCreateWindow() の定義を見ればイッパツ。
定義を見ようとしましたが見ることが出来ませんでした。
CFrameWnd::PreCreateWindow()を検索しましたがプログラムのコードの中には定義らしい
ものは見つけられませんでした。
とここまで、質問を書いたところでちょっと待てここまで恥をさらして良いものかと
ヘルプを見よと言っているんだなと気づき、さらにこのヘルプは見覚えがあるぞどこを見れだ
いいんだと思ってさがしたら、拡張スタイルが一番下にあるではないですか。

ということで、cs.dwExStyle &= ~WS_EX_CLIENTEDGE;の意図はわかりましたが、
ウィンドウの境界の縁の3Dは消えませんでした。

>補足というか、何というか。
ことばのご配慮感謝します。

>試しに、今作ってるアプリケーションを MFC を使わずに書いてみてごらん。
>そうすれば、MFC の良さも MFC の悪さも、便利な点も不都合な点も、いろいろと
>見えてくるハズです。
SDKの勉強も数ヶ月やりました。といっても読むだけでコードを直接打ち込んないので
身についてはいませんが。と言うことで今ようやくMFCにTRY出来るようになった
ところです。仮にSDKが理解できていたとしても、MFCのとっつき難さをあらためて
クリアする必要があると感じてます。
(SDKの勉強は十分今役立っています。だだMFCに移行するときにはMFC独自の最初の
高い敷居を超える必要がある。と私は感じています。Shimuraさんのアドバイスを否定するもの
では決して有りません)


返信引用
MK
 MK
(@MK)
ゲスト
結合: 25年前
投稿: 66
 

kazumaさん こんにちは、前文が長くなってしまったので、分けました。
いろいろアドバイス有難うございます。

>「ビューのほうの WS_EX_CLIENTEDGE もはずさないと」いけません。
ビューのほうは、プロジェクト作成時のウィザードにより作成された状態からいじっては
いませんが、ビューがなにかしらの影響を与えているのならと思い
以下を削除しましたがエッジは消えませんでした。

BOOL CABCView::PreCreateWindow(CREATESTRUCT& cs)

# 先ほどの書き込みで MK さんの名前に敬称を付けるのを忘れていました。
# ごめんなさい。
教えてもらう身なので我慢、我慢というか、文章から付け忘れとすぐ分かりました。
いつもアドバイス有難うございます。

>(CView::PreCreateWindow で何やらやっている。)
この辺の意味を理解できるだけの力がまだありません。
コードの中にCView::PreCreateWindowがあると言うことは、当然CViewでもPreCreateWindow
をよびだして何やらやっているということで良いのでしょうか?
今後のことも考え教えていただけるとありがたいです。

<ここからは独り言>
当然、私のようにメニューバーやフレームを取りたいと思う人はたくさんいて、
ネット上でも質問している人はたくさんいます。
でも、解決した結果は見つけれません。
以下調査結果
1.分かりましたやってみます。で終わっている。
2.出来ました。とかいてあるがどうやったら出来たのか書かずに終わっている。
3.著名なサイトでまさにフレームは消えるがエッジが残るとの質問に著名な人本人が
  私にも分かりません。(笑)で終わっていた。
4.ネット上あるいは本にエッジなしのウィンドウのコードはあるが、SDKか
  ダイアログベースで書かれていて、MFCのメインウィンドウの例は見つけられなかった。
  


返信引用
MK
 MK
(@MK)
ゲスト
結合: 25年前
投稿: 66
 

とうとう出来ました。
OnCreateを追加し、以下のとおりです。

int CXXXView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;

// TODO: この位置に固有の作成用コードを追加してください
ModifyStyleEx(WS_EX_OVERLAPPEDWINDOW,0,0);////■これを追加

return 0;
}


返信引用
Shimura
 Shimura
(@Shimura)
ゲスト
結合: 22年前
投稿: 36
 

とりあえず、解決されたというコトなので、最後の補足をば。

>↓これのことでしょうか?
それのコトです。で、CFrameWnd::PreCreateWindow() の定義を見ると

BOOL CFrameWnd::PreCreateWindow( CREATESTRUCT& cs)
{
・・・・
cs.dwExStyle |= WS_EX_CLIENTEDGE;
  ・・・・

return TRUE;
}

なんてコトをやってるのがわかると思います。だから、これを呼び出した後には、

cs.dwExStyle &= ~WS_EX_CLIENTEDGE;

して、拡張スタイルを消してやらなきゃダメなんです。これが先述した「理由」という
ヤツ。「定義を見よ」とは、この、CFrameWnd::PreCreateWindow() のコードを見よ、
ってコト。(関数の「定義」とか「宣言」とかいう言葉を聞いたコトあるよね?)

>以下を削除しましたがエッジは消えませんでした。
>↓
>BOOL CABCView::PreCreateWindow(CREATESTRUCT& cs)

これを消しちゃうと、エッジは消えません。なぜなら、CView::PreCreateWindow() の
なかで、WS_BORDER スタイルを WS_EX_CLIENTEDGE スタイルに変更する、なんてコト
をやってるから。
これをさして、kazumaさんは↓こうおっしゃっているワケ。
>(CView::PreCreateWindow で何やらやっている。)

だから、CABCView::PreCreateWindow() ではこうなります。

BOOL CABCView::PreCreateWindow(CREATESTRUCT& cs)
{
cs.Style &= ~WS_BORDER; // (1)
if ( !CView::PreCreateWindow( cs)) return FALSE;

cs.dwExStyle &= ~WS_EX_CLIENTEDGE; // (2)

return TRUE;
}

※ (1) と (2) はどちらか一方でよい。これが kazumaさんのおっしゃっている

>後からやるときは WS_EX_CLIENTEDGE をはずせば OK です。

にもつながってくる。もちろん、C**View::OnCreate() でコレをはずしても特に問題は
ない。(「一度つけておいて、すぐにはずす」という、コード的な回り道はあるけど
ね)。

><ここからは独り言>
独り言にリプライするのも何ですが。
質問だけしておいて、後始末をしない質問者が多いのは僕も感じてます。
ただ、そういう人には何を言ってもムダだろうから、何も言いません。
後々に自分がソンをするだけです。
願わくば、MKさんがそうならないコトを。


返信引用
MK
 MK
(@MK)
ゲスト
結合: 25年前
投稿: 66
 

Shimuraさん 今回のことではいろいろお世話になりました。

解決ということで終わりにしたかったのですが、最後の補足を受け、また
私と同様の悩める初心者のために敢えて書きます。と言うか自分が納得したいから・・

他のサイトでも過去に同様のやり取りをしているところを見つけました。

やはり回答者はShimuraさんと同じことをアドバイスしているのですが、質問者のほうは
うまくいかないと言って困っておりました。実は私もアドバイスどおりではうまくいきません。

おっしゃていることの意味は分かりますし、私もそう思うのですが事実うまくいきません。
ということで、探しまくって、そう言うときはこうしろと言うサイトを見つけようやく解決に
いたったしだいです。

多分両者の間に何らかの思い違いなり環境の違いがあると思われます。

アドバイス通りではうまくいかないけれど、MK(さん)はうまくいったのだろうか
と悩んでいる他の初心者のために敢えて書きました。


返信引用
MK
 MK
(@MK)
ゲスト
結合: 25年前
投稿: 66
 

Shimuraさん 申し訳ありませんでした。

教えていただいた情報のみでうまくいきました。

勘違いは私のほうでした。
只いじりすぎて良く分からなくなってしまいました。
とりあえず訂正のメールです。

最後にひとつ。
前にも書きましたが、以下の定義を見よと言うことで探しましたが、ウィザードが作った
コードの中には見つけれませんでしたので、私はヘルプで調べました。

コード見よといわれましたが、プロジェクトの中のどこかにコードがあるのですか?

>CFrameWnd::PreCreateWindow() の定義を見ると

>BOOL CFrameWnd::PreCreateWindow( CREATESTRUCT& cs)
>{
> ・・・・
> cs.dwExStyle |= WS_EX_CLIENTEDGE;
>  ・・・・

> return TRUE;
>}

>なんてコトをやってるのがわかると思います。
>「定義を見よ」とは、この、CFrameWnd::PreCreateWindow() のコードを見よ、
>ってコト。(関数の「定義」とか「宣言」とかいう言葉を聞いたコトあるよね?)


返信引用
Shimura
 Shimura
(@Shimura)
ゲスト
結合: 22年前
投稿: 36
 

>コード見よといわれましたが、プロジェクトの中のどこかにコードがあるのですか?
MFC のソースコードです。VC++6.0 ならば、デフォルトの場合、

\Program Files\Microsoft Visual Studio\VC98\MFC\SRC

にあります。なければ、インストール時に「インストールしない」を選択されているの
で、今後のためにも追加インストールしておくといいです。


返信引用
固定ページ 2 / 3

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました