• 締切済み

リストコントロール特定行のフォント情報取得VC++

この前の http://okwave.jp/qa/q6734007.html の続きです。 (ちょっとだけ↑の訂正します。 XPにEXEを持っていった所、低スペックが関係しているのか、 色の反転の部分が不安定でした。僕が追加したほうの条件を残し、その直後のElse の条件内は削除してください。) それはおいておいて、(本題)度々、質問すみません。 リストコントール特定行のフォント情報取得の方法が分かりません。 http://www.g-ishihara.com/mfc_dc_02.htm の部分の this の代わりに入れるものが分かりません。 CClientDC cdc(this); のところです。 ClientDC cdc(CFileListCreatorDlg::m_xcList.GetItem(workRow)); とでもしたいのですが。。。 フォント情報を取得したいタイミングは、リストを書き出すときです。行単位しか指定できなくてもかまいません。 GetCurrentFont()で取得できるとは、思いますが、オブジェクト名をどうやって指定するのかが分かりません。 MSDN http://msdn.microsoft.com/ja-jp/library/zdff988k.aspx も見ましたが、良く分かりませんでした。何か調べ方にコツがあるのでしょうか。。。。 リストの変数名はm_xcListです。 どうすればいいか、教えてくださると うれしいです。

みんなの回答

回答No.1

>GetCurrentFont()で取得できるとは、思いますが、オブジェクト名をどうやって指定するのかが分かりません。 CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CFONT *pFont = pDC->GetCurrentFont(); ではダメなんでしょうか?

psychang
質問者

お礼

ご回答ありがとうございました。 お教え頂いたことを、試行錯誤してましたが、 http://oshiete.goo.ne.jp/qa/6752231.html にて、解決しました。 質問の意図が伝わらず、ご迷惑をお掛けしましたm(_ _)m

psychang
質問者

補足

ご回答ありがとうございます。  CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);  CFont *pFont = pDC->GetCurrentFont();  //http://msdn.microsoft.com/ja-jp/library/zhcs623h.aspx  if (NULL != pFont)  {   LOGFONT lf;   pFont->GetLogFont(&lf);   //TRACE(_T("Typeface name of font = %s\n"), lf.lfFaceName);   if(lf.lfWeight == FW_BOLD){    MessageBox(_T("太文字です"));   }     } ご指摘のように確かに *pFontには、試してみると一個一個フォント情報が入っています。 しかし、一個セットする度に上書きされている(?)と思ってしまいます。 前回教えて頂いた方のおかげで、「lpDrawItemStruct」を手がかりに、 void CListCtrlOwner::DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct ) 【DrawItem関数内】で、 フォント情報を変えたり、LOGFONT(?)に書き出す事はできても、他のユーザー関数で どう呼び出すかが、すごく疑問です。CFont *pFontを MylistCtrl.h Public で宣言してみましたが、 実行時エラーが起こります。(ダミーのフォントを入れる必要があるのでしょうか?) どこで、フォント情報を格納し、どこで、取得するのか=GetCurrentFont()するのか、全く分かりません。すみません。(lpDrawItemStructが使えないので) 例えば、あるボタンを押した時に、リスト一行目 一列目のアイテムが FW_BOLDであるか(フォント情報)を得るには、どう書けばいいでしょう。。。定数以外は、適当なネーミングでかまいませんので、教えてください! ただ、logというぐらいですから、バッファにフォント情報がストックされていると考えていいのですか? ↓後、これは、使えますでしょうか? static HFONT CreateMyFont(int nBold)//追加 2011.05.13 { //ディフォルトフォントをゲットする HFONT hFontDef = (HFONT)GetStockObject(DEFAULT_GUI_FONT); //フォントの詳細を受け取る構造体バッファ LOGFONT lf; //フォントハンドルから詳細を受け取る GetObject(hFontDef, sizeof(lf), &lf); //このメンバにフォントの太さを設定する lf.lfWeight = nBold; //フォントの作成 return CreateFontIndirect(&lf); } フォントハンドル の ハンドルという言葉がキーかと思いますが、 どうやって、指定するのかが、分かりません。 長々とすみませんm(_ _)m

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • SELECTでn行目から最後もしくはn行目以外が取得したい

    SELECT * FROM hoge LIMIT 10, 20 とすれば10行目から20行目が取得できるのはわかるのですが、2行目から最後までとか、1行目から最後から一行前までを取得するには? ただし、n行はWHEREで条件が指定できないもととします。 一行目にシステム上必要なデータが入っているが、クライアントがブラウザなどから表示した際に見られたくないからです。 お願いします。

    • ベストアンサー
    • MySQL
  • Excel オートフィルタのリストを取得したい

    ExcelのVBAです。 オートフィルタの▼をクリックすると、 重複していないリストが出ます。 このリストを列ごと(指定列)取得したいです。 できれば、Functionで組み、 配列に格納し、使いたいと思っています。 戻り値で配列は出来なかった気がしますが、 どうでしょうか… やりたいことをまとめます。 ---------------------- Call オートフィルタリスト("A") 配列をリストボックスに表示 選択し、上下の配置などを変更できるように (Excelも連動し、2行目と3行目の位置を変更したりすることができる) 新規追加 そのリスト最終行に新規データを入力 そして、それをExcelにも反映 ------------------------ Function オートフィルタリスト(指定列) 配列定義 指定列の範囲選択 オートフィルタのリストを配列に格納 (重複は削除します) 配列を返します。 End Function ------------------------------ まとめるどころか余計ぐちゃぐちゃした気もしますが、 回答よろしくお願い致します。

  • フォントサイズ変えたら、文字数行数がおかしく

    マイクロソフトのワードを使って、レポートを書いています。 1ページの設定が、1行25文字。1ページ40行になるように、という指定があります。 これまで、それで問題なくやっていました。 変更がありました。  「あ。でも12ポイント以上の文字の大きさにして」、という新しい条件が付け加わりました。 指示にしたがって、ページ全体のフォントの大きさを10.5 から 12に変えました。 すると、自動的に 【1行22字 1ページも35行】になってしまいました。 今度はこの字数と行数を調節しようと「ページ設定」に行ったのですが、 そこをみると 【1行25文字 1ページ40行】 という設定になっていました。 文字の大きさ 文字数・行数設定 以上2つの条件を同時に満たすためには、どうしたらよいでしょう??

  • コントロールのフォントの変更

    コントロールに任意のフォントを指定できなくて困っています。 class CFrame : public CFrame { private: CFont m_cFont; CStatic m_cStatic; public: CFrame(); afx_msg void OnCreate(LPCREATESTRUCT); }; CFrame::CFrame() { Create( // 省略 ); m_cFont.CreateFont( // 省略 ); } axf_msg void CFrame::OnCreate(LPCREATESTRUCT lp) { RECT rect; DWORD dw; rect.top = 10; rect.left = 10; rect.right = 100; rect.bottom = 60; dw = WS_CHILD | WS_VISIBLE; m_cStatic.Create("AAAAAA", dw, rect, this, ID); m_cStatic.SetFont(&m_cFont, TRUE); } 文字は表示されるのですが、フォントがおそらくデフォルトのままだと思われるのですが、どうしてかわかりません。 ダイアログベースでは、OnInitDialogで実行していたと思いますが、以上のコードではだめなんでしょうか? よろしくお願いします。

  • リストコントロールのデータの変更を検知したい

    リストコントロールのデータの変更時に呼び出されるイベントが分かりません、 OnLvnItemchangedList()であっているのでしょうか?もっと簡単に実現できるのなら、 教えてください。 VC++2010 MFC です。 削除のときは、条件なしに、OnLvnDeleteitemList()内でいいのですが、 追加も pNMLV->uChanged == 4 にすれば問題ないです。でもその他は、厳しくしすぎると クリックしただけで、データが変更されたと判断されたり、・・・でうまく行きません。 【リスト上のデータが変更されるケース】 データが変更される場合は、非選択状態から「すべてを置換」するケースや 一個一個 検索(選択)しながら、「置換」するケースがあります。 後は、リストコントロールにエディットボックスを張り付かせて、「編集」(エンターで確定) して、データを変更するケースがあります。 ただし、「すべてを置換」する場合でも、既に選択状態のデータを処理する場合もあり、困っています。 自分で作ったプログラムなのですから、各機能終了時に変更されたか?されてないか?は 分かっているのですが、勉強のため、質問をしました。 PreTranslateMessage()で出来るのでしょうか? (参考サイト: http://isobe.exblog.jp/996027/ ) 【目的】 起動時 から(前回保存時から)リストデータに変化がない場合、何もせずに終了したい 【やりたいこと】 リストの文字が変わったら、キャプションを FileListCreator(*) にすると ともに、ListDataNoChange_FLG = FALSE; にする。 保存ややリカバリ(復帰)を行ったら (*) を取って、 ListDataNoChange_FLG = TRUE; にする。 if ( ListDataNoChange_FLG == TRUE ) //保存処理をスキップする。 【できれば】 あとは、pNMLV->uChanged などの 4とか8とか、定数で記述したいです。 lParamが何を意味しているか?分からないです。教えて下さい。 void CFileListCreatorDlg::OnLvnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult) {   LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);   // TODO: ここにコントロール通知ハンドラー コードを追加します。   if (( pNMLV->uChanged == 4 && pNMLV->uNewState == 0 && pNMLV->uOldState == 0 ) //リストコントロールにアイテムが追加した時     || ( pNMLV->uChanged == 8 && pNMLV->uNewState == 3 && pNMLV->uOldState == 0)){ //「すべてを置換」「置換」ボタンを押した時 //「検索」ボタンで検索しただけでも選択状態になる     //|| ( pNMLV->uChanged == 8 && pNMLV->uNewState == 0 && pNMLV->uOldState == 1 )     //|| ( pNMLV->uChanged == 8 && pNMLV->uNewState == 0 && pNMLV->uOldState == 2 )     //|| ( pNMLV->uChanged == 8 && pNMLV->uNewState == 0 && pNMLV->uOldState == 3 )){     ListDataNoChange_FLG = FALSE;//追加 2012.05.13          CFileListCreatorDlg* m_Dlg = (CFileListCreatorDlg*)AfxGetMainWnd();     if( (m_Dlg==NULL)||(m_Dlg->GetSafeHwnd()==NULL) ){       return;     }     m_Dlg->SetWindowText(_T("FileListCreator (*)"));   }   //CString tempStr;   //tempStr.Format(_T("OnLvnItemchangedList iItem: %d, lParam: %d, uChanged: %d, uNewState: %d, uOldState: %d\n"), pNMLV->iItem, pNMLV->lParam, pNMLV->uChanged, pNMLV->uNewState, pNMLV->uOldState);   //MessageBox(tempStr);   *pResult = 0; } void CFileListCreatorDlg::OnLvnDeleteitemList(NMHDR *pNMHDR, LRESULT *pResult) {   LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);   // TODO: ここにコントロール通知ハンドラー コードを追加します。   ListDataNoChange_FLG = FALSE;//追加 2012.05.13   CFileListCreatorDlg* m_Dlg = (CFileListCreatorDlg*)AfxGetMainWnd();   if( (m_Dlg==NULL)||(m_Dlg->GetSafeHwnd()==NULL) ){     return;   }   m_Dlg->SetWindowText(_T("FileListCreator(*)"));   *pResult = 0; } ご教授下さい。

  • 仮想リストコントロールの表示

    お世話になります、fujitomoです。 今回ご意見を頂きたいと思い、質問させて頂きましたのはVCでの仮想リストコントロールにデータを表示する件に関してです。 具体的に申し上げますと、 あるデータが記述されたcsvファイルがあり、そのcsvファイルのある位置から200件のデータを仮想リストコントロールに表示させたいと思っています。 そこで、私が考えたアプリケーションの作りとして、初めにcsvファイルからデータを読み込んでCStringの二次元配列に各セルのデータを保存します。 そしてLVN_GETDISPINFOを受ける関数を作成し、そこでリストコントロールにCStringの二次元配列の値を当てはめていこうと思っています。つまり、関数内でリストの項目とCStringの二次元配列を1対1に対応させています。 しかしここで、LVN_GETDISPINFOを受ける関数は常にCStringの二次元配列の1行目から見てしまい、例えば、リストコントロールに100行目からのデータを表示させたいと思い、LVN_GETDISPINFOを受ける関数内でリストコントロールに表示させる開始行を指定したとしても0~99行目までが空白となって表示されてしまいます。目的の動作としては100行目からの200行をリストに表示させたいと思っているのでこれではダメです。 仮想リストコントロールを使うのは初めてで、どのように使うのが定石なのか分からない為悩んでいるのですが、私の目的の動作を達成させるためには表示させたい200行分のデータをその都度CStringの二次元配列に格納し、その配列とリストの項目をLVN_GETDISOINFOを受ける関数内で対応させるべきなのでしょうか? 文章だけではかなり分かりづらいと思うので、大雑把にですがソースを載せます。 //メンバ変数 CString data[gyo][row] //データを保存するCString二次元配列 CListCtrl m_list; //リストコントロールのコントロール変数 int start; //リスト表示行 //ダイアログの初めに BOOL C***Dlg::OnInitDialog() { CDialog::OnInitDialog(); Read_File(); //csvファイルをCStringの二次元配列に保存 m_list.SetItem(200);//200件表示に設定 return TRUE; } LRESULT C***Dlg::DefWindowProc(UINT message,WPARAM wParam,LPARAM lParam) { switch(message) case WM_NOFITY: return OnGetListInfo(lParam); } return CDialog::DefWindowProc; } LRESULT C***Dlg::OnGetListInfo(LPARAM lParam) { LPNMHDR lpnmh = (LPNMHDR)lParam; CWnd* hwndListView = GetDlgItem(IDC_LIST1); LV_DISPINFO* lpDInfo; switch(lpnmh->code){ case LVN_GETDISPINFO: lpDInfo = (LV_DISPINFO*)lParam; if(lpDInfo->iItem.mask & LVIF_TEXT){ if(lpDInfo->item.iItem >= start){     switch(lpDInfo->item.iSubItem){ case 0: _tcscpy_s(lpDInfo->item.pszText,256, data[lpDinfo->item.iItem][lpDinfo->item.iSubItem]; break; } } } break; } return 0; } といったソースとなっています。 ご意見を宜しくお願い致します。 尚、開発環境は Windows CE 6.0 Visual Studio 2005 です。 ご回答をお待ちしております。

  • クリックした位置に画像を貼り付ける方法

    開発環境はWinXP、C++、MFCを使っています。 C++を勉強し始めた初心者です。 画面上で左クリックされた位置に画像(ビットマップ画像)を表示させる簡易プログラムを作ろうとしています。 ここで、マウスの位置を取得する方法がわかりません。理解しやすい方法があれば押してください。 ちなみにこんな感じでつくってます。。。↓ void Canvas::MakeStamp() //Canvas ・MaskStamp共に任意の名前 { // //ここでマウスの位置を取得したいです // //画像を貼り付け CClientDC cdc(this); CDC bmpCDC; bmpCDC.CreateCompatibleDC(&cdc); CBitmap bmp; bmp.LoadBitmap(STAMP); //STAMPは任意の名前 bmpCDC.SelectObject(bmp); cdc.BitBlt(X,Y,60,60,&bmpCDC,0,0,SRCCOPY); //ここのX,Yはクリックした座標を当てはめるつもりです。 } よろしくお願いします。

  • グループ毎に条件指定で最新の行を取得

    グループ毎に条件指定で最新の行を取得 はじめまして。SQLクエリについてずっと頭を悩ましている問題がありまして、 識者の方に相談したく投稿します。 ID Revision -- -------- 01 1 01 2 01 3 02 1 03 1 上記のようなデータがあって、指定したRevision以下で 最新のデータのみを抽出することをViewで実現したいのですが、 可能でしょうか?(ViewにRevisionの条件を与えたいのです) 例えば、Revisionに2を指定した場合は select * from view_hoge where revision = 2 ID Revision -- -------- 01 2 02 1 03 1 となれば期待通りです。

  • VBA Excel 特定の記号を含んだ行

    Excel VBAにて、質問します。お手数ですが宜しくお願いします。 画像の様に、E列に特定の記号"●"や"▲"含んだ行以外、抽出し 印刷のシート名に貼り付けしたいと思います。 ですが、条件がありまして、その条件とは、InputBoxを使って 抽出したい日付を入力し、入力した日付、時刻までの記号"●"や"▲"以外 を抽出できる様にしたいです。 例えば実行時の日付が8/21日ならば InputBoxに、8/28 20:00と入力したら、入力した日付、時刻までの 記号"●"や"▲"以外を抽出となります。 画像の様に、1行目の見出し名も貼り付けできる様に、VBAを使って できませんでしょうか? ※ 画像ではSheet1のみ載せましたが、 Sheet2とSheet3とSheet4とSheet5とSheet6まで似た内容のデータがあるので シート名を指定して動作できると良いです。 Array("Sheet1","Sheet2","Sheet3","Sheet4","Sheet5","Sheet6")見たいな 感じでできますでしょうか? 御面倒お掛けしますが宜しくお願いします。

  • VBA Excel 特定の記号を含む行で

    Excel VBAにて、質問します。お手数ですが宜しくお願いします。 画像の様に、E列に特定の記号"●"や"▲"含んだ行以外、抽出し 印刷のシート名に貼り付けしたいと思います。 ですが、条件がありまして、その条件とは、InputBoxを使って 抽出したい日付を入力し、入力した日付、時刻までの記号"●"や"▲"以外 を抽出できる様にしたいです。 例えば実行時の日付が8/21日ならば InputBoxに、8/28 20:00と入力したら、入力した日付、時刻までの 記号"●"や"▲"以外を抽出となります。 画像の様に、1行目の見出し名も貼り付けできる様に、VBAを使って できませんでしょうか? ※ 画像ではSheet1のみ載せましたが、 Sheet2とSheet3とSheet4とSheet5とSheet6まで似た内容のデータがあるので シート名を指定して動作できると良いです。 Array("Sheet1","Sheet2","Sheet3","Sheet4","Sheet5","Sheet6")見たいな 感じでできますでしょうか? どの様なコードを書けば良いでしょうか? 御面倒お掛けしますが宜しくお願いします。

このQ&Aのポイント
  • 質問者はかまって君との関係に悩んでいます。
  • かまって君からの連絡やアピールに困惑している質問者。
  • 身体の関係はないが、キスだけされた経験を持つ質問者。
回答を見る