プロパティシートのOKボタンについて – プログラミング – Home

プロパティシートのOKボタンについて
 
通知
すべてクリア

[解決済] プロパティシートのOKボタンについて


M&K
 M&K
(@M&K)
ゲスト
結合: 22年前
投稿: 15
Topic starter  

http://www2.famille.ne.jp/~chiba/software/OboeGaki/cpidl.html
このサイトにあるシン覚え書をDLして実行すると、タスクトレイにアイコンが表示
されます。

アイコンを右クリックして新規作成をクリックするとプロパティシートで作成された
ダイアログが出ます。
このダイアログのOKボタンを押すと実行されるコードはどれなのかが分かりません。

お分かりの方どうか教えてください。

http://www2.famille.ne.jp/~chiba/software/OboeGaki/forDev/index.html
ここからは、ソースがDLできます。

<補足>
ダイアログベースで作成した場合、OKボタンをダブルクリックするとコードの画面が
開きますが、このプログラムではリソースにダイアログががないのでOKボタンが
押せず、ダブルクリックで開くことが出来ません。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

'作者'は教えてくれなかったのですか?


返信引用
ボコノン教徒
 ボコノン教徒
(@ボコノン教徒)
ゲスト
結合: 23年前
投稿: 90
 

CPropertyPage::OnOK() 又は CPropertyPage::OnApply()


返信引用
M&
 M&
(@M&)
ゲスト
結合: 22年前
投稿: 2
 

επιστημηさん、回答ありがとうございます。

>'作者'は教えてくれなかったのですか?
作者へは聞いていません。まだ、作者のHPの性格が良く分かっていないので。。。

ボコノン教徒さん、回答ありがとうございます。

CPropertyPage::OnOK()はソースコードの中にありました。
CPropertyPage::OnApply()は有りませんでした。
以下が見つけたコードです。

void CBaseEditPage::OnOK()
{
if( UpdateData())
{

m_cStrMemo4IF = m_cStrMemo;
CSOboeApp* pcSOboe = ( CSOboeApp*)AfxGetApp();
ASSERT( pcSOboe);
BOOL blTrim = pcSOboe->IsAutoTriming();
}

CPropertyPage::OnOK();
}

OKボタンを押すと直接CPropertyPage::OnOK();を実行するとは思えないのですが、
最初に実行されるコードはどこなのでしょうか?

<補足>
現在私が知りたいこととは関係ないと思われるコードをひたすら削除して、ちゃんと
作動するか確認し続けて、半日経ちます。

消しても消してもまだ終わりません。
打ち込んだ人は、いったい何日かけて作ったのでしょう?すごい。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

通過する場所が分かったのなら、
そこにブレークポイントを張り、
止まったときにコールスタックを遡れば分かるのではないでしょうか。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

そもそもシン覚書はずいぶん前からバージョンアップを重ねて
現在に至ったものです。(私もずいぶん前からお世話になっています。)
ちょっとやそっとの時間で作成されたものではありません。
当然、現状のソースからは削除された部分もあるでしょうし、
そうした部分も考えるとコード量は膨大になるでしょう。

オンラインソフトのコードは、作者自身の癖もあるでしょうし、
オープンソースを意識して作成したもので無い限りは、
コードを書いた本人が理解できれば良いという観点で作成されていると思います。
まあ、概して他人が書いたコードというのは読みにくいことが多いですけれど。

読み下せる程度の知識がないときついかもしれないですね。
入門書に載っているようなわかりやすいコードを期待するのはちょっと酷かと思います。

プロジェクト一式あるのでしたら、下手にコードを削るよりデバッガで追ったほうが
いいと思いますよ。
ソースを見て全体の流れを把握できるくらいのスキルがあれば別ですけれど。


返信引用
7of9
 7of9
(@7of9)
ゲスト
結合: 22年前
投稿: 14
 

>このダイアログのOKボタンを押すと実行されるコードはどれなのかが分かりません。

#実際のものとは違うと思いますが,
CBaseEditPage の親プロパティシートを CXXPropertySheet とすると、
CXXPropertySheet cps;
if(cps.DoModal() == IDOK){
// <---- OKで、シートを終了したときには、ここに着きますが。
}

いずれにしても、ご自身で解決できないと、この先、実際に調べたいことまで
到達するのは、もっと大変ではないでしょうか。

http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200307/03070077.txt
の続きだと思ったので、、、。


返信引用
M&
 M&
(@M&)
ゲスト
結合: 22年前
投稿: 2
 

皆さん回答ありがとうございました。
もう見捨てられたと思っていたので非常に嬉しかったです。

>dairygoodsさん

>通過する場所が分かったのなら、
>そこにブレークポイントを張り、
>止まったときにコールスタックを遡れば分かるのではないでしょうか。
しばらく触っていなかったのでやり方を忘れてしまいました。
ちょっと今回は後回しにさせて下さい。

>PATIOさん

>プロジェクト一式あるのでしたら、下手にコードを削るよりデバッガで追ったほうが
>いいと思いますよ。
そのとおりだと思います。あとでトライしてみます。

>7of9さん

>CBaseEditPage の親プロパティシートを CXXPropertySheet とすると、
>CXXPropertySheet cps;
>if(cps.DoModal() == IDOK){
> // <---- OKで、シートを終了したときには、ここに着きますが。
>}
ヒントありがとうございます。大変役立ちました。
大体コードの雰囲気は分かったのですが、どうも知りたい核心が今1つ分かりません。

結局、画面に貼ってある付箋紙は、
画面に四角を描いているのでしょうか?
それとも、ダイアログボックスなのでしょうか?
はたまた、フレームを外したウィンドウなのでしょうか?

それだけでも、ご存知の方教えてください。

<補足>
今日も一日中、不要なコードを削除し続け、マウスをクリックしっぱなしで
とうとう腱鞘炎になってしまいました。
そろそろ気力も無くなり、諦めかけています。


返信引用
7of9
 7of9
(@7of9)
ゲスト
結合: 22年前
投稿: 14
 

>はたまた、フレームを外したウィンドウなのでしょうか?
多分、そうだと思います。

CWnd を派生した CMemoChip において、
生成は、CMemoChip::Create 内で、
BOOL blRe = CWnd::CreateEx( WS_EX_TOOLWINDOW, m_cStrClassName, cStrCaption,
( !blHide && m_cMemoData.IsShow()) ?
( WS_BORDER | WS_POPUP | WS_VISIBLE) : ( WS_BORDER | WS_POPUP),
cRect.left, cRect.top, cRect.Width(), cRect.Height(), NULL, NULL);
で、描画は、
void CMemoChip::OnPaint()
で行っているようです。

#正確に、デバッガで追ったわけでないので、正しいか不明です、m(__)m


返信引用
M&K
 M&K
(@M&K)
ゲスト
結合: 22年前
投稿: 15
Topic starter  

7of9さん、何時も適切な回答ありがとうございます。

>CWnd を派生した CMemoChip において、
>生成は、CMemoChip::Create 内で、
> BOOL blRe = CWnd::CreateEx( WS_EX_TOOLWINDOW, m_cStrClassName, cStrCaption,
> ( !blHide && m_cMemoData.IsShow()) ?
> ( WS_BORDER | WS_POPUP | WS_VISIBLE) : ( WS_BORDER | WS_POPUP),
> cRect.left, cRect.top, cRect.Width(), cRect.Height(), NULL, NULL);
コードをいじってみたら、まさしくこれで一般的なウィンドウ(?)で
描かれていることが確認できました。(あぁ~ すっきりした)

>描画は、
> void CMemoChip::OnPaint()
>で行っているようです。
ここでは、文字を書いていることが確認できました。

*****************************************

以下は以前教えていただいた内容ですが、プロパティーシートのOKボタンを
押したときのIDOKに相当するコードがどこにも見当たらないのですが。。。。

>#実際のものとは違うと思いますが,
>CBaseEditPage の親プロパティシートを CXXPropertySheet とすると、
>CXXPropertySheet cps;
>if(cps.DoModal() == IDOK){
> // <---- OKで、シートを終了したときには、ここに着きますが。
>}


返信引用
M&K
 M&K
(@M&K)
ゲスト
結合: 22年前
投稿: 15
Topic starter  

さっきの質問のIDCANCELは以下だと思うのですが、IDOKの記述が見つからないのですが。。。

int CMemoEditSheet::DoModal()
{
// TODO: この位置に固有の処理を追加するか、または基本クラスを呼び出してください
int nResult = IDCANCEL;
CSingleLock cSlk( &sm_cSmpDoEdit);
if( cSlk.Lock( 0))
{
sm_hWndParent = m_hWndParent;
nResult = CPropertySheet::DoModal();
sm_hWndParent = NULL;
}
return nResult;
}


返信引用
M&K
 M&K
(@M&K)
ゲスト
結合: 22年前
投稿: 15
Topic starter  

皆さん、いろいろアドバイスありがとうございました。

タイトルとは内容が変わってしまいましたが、プログラム中にメッセージボックスを
配置することで、プログラムの流れとどうやって付箋紙を表示しているのか分かりました。

結果的にはこれまで書いた内容と変わり有りませんが、漠然とした理解からコードの流れを
正確に掴む事で明確な理解となりました。

これからもよろしくお願いします。m(__)m


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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