プロが教えるわが家の防犯対策術!

リストビューで1行おきに背景色を変えたくて、
http://homepage3.nifty.com/mitui707/VisualC/VCli …
を参考にさせて貰らい、データを次々に追加していくと、サンプル通りに5行目の背景色と文字色は変わりました。
が、起動時の何もデータが無い状態の空のリストビューで1行おきに背景色を変えたいのです。
色々と試してますが、まだ初心者のため間違っているのかうまくいきません。
どなたか助言をお願いします。

VC++6.0を使用しています。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

 こんばんは。


 回答が未だ持ってないのであえて投函いたします。
 質問者様の質問意図は十分に伝わっております。
 ある程度試してみましたが、これは正攻法では不可能かもしれません。
 かく言う私も、リストビューに着色した事がありますが、追加されたアイテム分のラインにしか着色しませんでした。
 リストビューにアイテムが追加されたりするたびにWM_DRAWITEM又はそれに対応したメッセージハンドラがコールバックされ、そこでようやく一行分を着色する処理が発生するためです。
 以下は私ならばこうするかも、というアイデアを記します。

 (1)ダミーのアイテムを一つだけ常に存在させます。これは何かしらのデータでダミーである事を判定できるようにしておきます。
 (2)一つアイテムが存在すれば、何か有るたびWM_DRAWITEMがコールバックされる筈です。
 (3)コールバックをキャッチしたら、リストビューのハンドルに対してTreeView_GetItemHeightを使って、アイテムの縦幅を取り出し、
LPDRAWITEMSTRUCT::rcItem::topを基準に逆算して、LPDRAWITEMSTRUCT::hDCに向かってFillRectあたりで交互着色していく事になるでしょう。
 何故このような逆算が必要かというのは、リストビュー自体が右端にある垂直スクロールバーによって、スクロールしている可能性があるからです。
 スクロールされていると、アイテムのLPDRAWITEMSTRUCT::rcItem::topが大きくて、中途半端な数字を示す筈です。
 可視領域の一番上がtop = 0とは限らないということです。

 ・・・とまぁ、そんなこんなで、標準コントロールに入り組んだ着色をするには正攻法では達成できない事があるのです。
 最後に付け加えるとすれば、ここまでのものを望んだ場合、CreateWindowExなどをクラスにラップして、独自のリストビューを実装してしまった方が早いかもしれません。
 私の場合は、標準コントロールに大きな限界を感じたときは、最終決断として、独自のコントロールをクラスで作成してきました。
 そちらの方が、痒い所に手が届きますし、機能追加も容易だからです。

 御健闘お祈りいたします。
    • good
    • 0
この回答へのお礼

回答、ありがとうございます。
とりあえず、可視領域行数分、ダミーを挿入して着色し、実データを挿入する際にダミーを1行づつ削除するという姑息な手段を取りました。

まだ、新VisualC++6.0入門の「スーパービギナー編」,「ビギナー編」,「シニア編」の3冊で勉強した程度ですので、助言頂いた内容を理解するには未熟者でして...。

もう少し学習し、内容を理解できるようになったら、やって見ます。
(回答して頂いて、うれしかったです。)

お礼日時:2008/07/07 13:33

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qリストビューで選択行の背景を変える

お世話になります。リストビューの選択行の背景色を変えたいと思い、カスタムドローを用い以下のようにしましたが、選択していない所も赤になってしまいます。

if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {
 // 選択行の背景色を変更
 if (lplvcd->nmcd.uItemState & CDIS_SELECTED) {
  lplvcd->clrTextBk = RGB(255, 0, 0);
  lplvcd->nmcd.uItemState &= ~CDIS_SELECTED;
 } else {
  lplvcd->clrTextBk = RGB(255, 255, 255);
 }
 return CDRF_NOTIFYSUBITEMDRAW;
}

デバッグモードで見ると、else以降の分は解釈されていないようです。
リストビューは

g_hList = CreateWindowEx(0 , WC_LISTVIEW , 0 ,
WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_NOSORTHEADER | LVS_SHOWSELALWAYS,
1 , 1 , width , lv_height , g_hMain , (HMENU)1 ,
g_hInst , NULL);

dwStyle = ListView_GetExtendedListViewStyle(g_hList);
dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_EX_SUBITEMIMAGES;
ListView_SetExtendedListViewStyle(g_hList, dwStyle);

ListView_SetBkColor(g_hList, RGB(240,240,240));

のようにしています。宜しくお願いします

お世話になります。リストビューの選択行の背景色を変えたいと思い、カスタムドローを用い以下のようにしましたが、選択していない所も赤になってしまいます。

if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) {
 // 選択行の背景色を変更
 if (lplvcd->nmcd.uItemState & CDIS_SELECTED) {
  lplvcd->clrTextBk = RGB(255, 0, 0);
  lplvcd->nmcd.uItemState &= ~CDIS_SELECTED;
 } else {
  lplvcd->clrTextBk = RGB(255, 255, 255);
 }
 return CDRF_NOTIFYSUBITEMDRAW;
}

デバ...続きを読む

Aベストアンサー

★『CDIS_FOCUS』定数を付けてみて下さい。
・つまり
>if ( lplvcd->nmcd.uItemState & CDIS_SELECTED ){
 ↑
 ここの部分を
 int check = (CDIS_SELECTED | CDIS_FOCUS);
 
 if ( (lplvcd->nmcd.uItemState & check) == check ){
 とします。
・リストビューやツリービューでは選択された場所を CDIS_SELECTED と CDIS_FOCUS 定数の
 両方のビットが立っているときです。CDIS_SELECTED 定数だけでは判定するのに不十分です。
 他にも LVNI_SELECTED、LVNI_FOCUSED 定数も同じ考えで2つ指定してから判定します。
・以上。

QVC++リストビューで選択されている色の変更

リストビューで表示スタイルをレポートにしています。
で、マウスなどでクリックすると当然のごとく青色に選択され、別のウィンドウをクリックすると灰色になるのですが、この青色と灰色両方の色を変えたいのですがどうしたらよいでしょうか?よろしくお願いします。

Aベストアンサー

dannerです。

質問にマッチするページがありましたので参考にしてください。
(開発者には有名なページなので要チェックです)
VCでの質問なら回答そのものだと思います。

参考URL:http://codeguru.earthweb.com/listview/LVHighlight.shtml

QcharからLPTSTRへの変換方法

リストコントロールにchar型の変数の値を数値として表示させたいのですが、charからLPTSTRへの洗練された変換方法がよくわからないです。

char tempChar;
CString tempString;
tempString.Format("%s", tempChar);
LPTSTR lpsz = new TCHAR[tempString.GetLength()+1];
_tcscpy(lpsz, tempString);

こんなプログラムを考えてみたのですが、汚いような気がします。もっと簡単で洗練された変換方法はないのでしょうか?

Aベストアンサー

wsprintfを使ってはどうでしょうか?

char tmpChar = 100;//表示する数値
TCHAR buf[5];
wsprintf(buf, "%d", tempChar);

Qリストの行ごとの設定変更について

vc++ でアプリケーション開発をしております。
読み込んだログファイルを表示する Viewer 機能を作成しているのですが
別画面で設定することにより、
任意の行の文字色を変更したり、
背景色を変えたり、フォントを Bold 表示にしたりしたいのですが
できません。

現時点では LISTBOX を使用してログ表示を行っているのですが
コントロールを他のものに変えれば可能なのでしょうか?

ご教授、宜しくお願いします。

Aベストアンサー

 こんにちは。まず、参考程度である事を前提といたします。

 フォントオブジェクトを生成しなければいけません。
 CreateFont()及びCreateFontIndirect()で行います。
 Bold表示とはフォントの太さを高めた物です。
 調査・検討してみてください。
 作成したフォントハンドルはデバイスコンテキストに指定します。

 以下はディフォルトフォントを元に太いフォント(Bold)を作成する例です。

static HFONT CreateMyFont(int nBold)
{
 //ディフォルトフォントをゲットする
HFONT hFontDef = (HFONT)GetStockObject(DEFAULT_GUI_FONT);

 //フォントの詳細を受け取る構造体バッファ
LOGFONT lf;

 //フォントハンドルから詳細を受け取る
GetObject(hFontDef, sizeof(lf), &lf);

//このメンバにフォントの太さを設定する
lf.lfWeight = nBold;

//フォントの作成
return CreateFontIndirect(&lf);
}

//何処かに前もって太いフォントハンドルを作成しておく
static HFONT s_hFontBold = CreateMyFont(FW_BOLD);
---------------------------------------------------------------
//以下はWM_DRAWITEMの中です
DRAWITEMSTRUCT* p = (DRAWITEMSTRUCT*)lParam;

//ListBox, ComboBoxの場合、itemIDのメンバは現在のアイテム行を示しています(ゼロベースです)。
//この処理は3行目のアイテムであった時
if(p->itemID == 2)
{
//オーナードロー用のデバイスコンテキストにフォントハンドルを設定 します(これで太い文字が反映される)

HFONT hFontOld = (HFONT)SelectObject(p->hDC, s_hFontBold);

//DrawText()などを使ってテキストを描写します

//終わったら以前のフォントに戻します
SelectObject(p->hDC, hFontOld);
}
---------------------------------------------------------------

 こんにちは。まず、参考程度である事を前提といたします。

 フォントオブジェクトを生成しなければいけません。
 CreateFont()及びCreateFontIndirect()で行います。
 Bold表示とはフォントの太さを高めた物です。
 調査・検討してみてください。
 作成したフォントハンドルはデバイスコンテキストに指定します。

 以下はディフォルトフォントを元に太いフォント(Bold)を作成する例です。

static HFONT CreateMyFont(int nBold)
{
 //ディフォルトフォントをゲットする
HFONT hFontDef...続きを読む

Qボタンの表示の色、フォントを変更したい

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べて、それらしい関数を見つけるのですが使い方がわかりません。
VCを始めたばかりで、クラスの理解がまだ浅いです。。。
関数の説明は理解できても、「じゃあ、コードはどう書くの?」という状態です。
「○○ は ×× のメンバではありません」と、よく怒られてます。。。

識者の方、ご教授願います。
コードがどうなるのか知りたいので、簡単なサンプルコードがあると助かります。

また、質問ではないのですが、「この関数は○○をする」というのではなく、
「○○をするにはこの関数を使う」という様に調べられる、お勧めの書籍、
Webなどがありましたら教えてください。
今後の勉強に役立てたいと思っています。

VC++でプログラミングしています。
MFCのダイアログベースのEXEを造っています。
ダイアログにはボタンとエディットボックスを貼り付けています。
私がやりたいのは以下のことです。

・ボタンの色を設定したい
・ボタン、エディットボックスに表示する文字の色を設定したい
・ボタン、エディットボックスに表示する文字のフォント(サイズ)を設定したい

プロパティでサイズ変更すると全体に反映されてしまうので、個々の
コントロールについて制御したいと思っています。

ヘルプで調べ...続きを読む

Aベストアンサー

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使っています;;

一番上はBitmapを貼り付けるか、CWndのメンバ関数を使って
塗りつぶすかどうかだと思います。

MFCではなく、C++Builderのページなのですが、少しいじればMFCでも使えるので、参考URLに示しておきます。

参考URL:http://market.agr.tottori-u.ac.jp/ken/tech.html

下2つについては以下でいけると思います。

class CMyDlg : CDialog
{
public:

  CFont m_cFont; //Dlgクラスのメンバとして用意
/*
  他のメンバ
*/
  virtual BOOL OnInitDialog(); //初期化

};


BOOL CMyDlg::OnInitDialog()
{
  //TODO:ここでFontを設定しておく(文字の色、サイズなど)

  //Fontを設定
  ((CButton *)GetDlgItem(IDC_BUTTON))->SetFont(&m_cFont,TRUE);

  //TODO:その他の初期化

  return TRUE;
}
//見易さのために、全角スペースを使って...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QCFileDialogの最初のディレクトリ設定

Visual C++のMFCです。

CFileDialogを使ってファイルを指定して開くと、カレントディレクトリの位置が変化して、次回、CFileDialogで開くときは、その変化したあとの最新のディレクトリが開きますね。
このカレントディレクトリは、GetCurrentDirectory で、調べることができました。

しかし、特定のディレクトリ(フォルダ)をCFileDialogで開きたいとき、SetCurrentDirectory で設定しようとしても、これでは、CFileDialogで開くフォルダ位置を変更できません。

CFileDialogで開きたいフォルダ位置を変更するコマンドを教えてください。

DoModal()をする以前に設定したいので、CFileDialogクラスとは別の関数、できれば、SDKの関数等であれば、いいです。

Aベストアンサー

CFileDialog のメンバにm_ofnというOPENFILENAME構造体があります
その中にさらにlpstrInitialDir というメンバ変数がありこれでイニシャルディレクトリが指定できます
----sample-----
CFileDialog fileDlg(TRUE);
fileDlg.m_ofn.lpstrInitialDir = TEXT("C:\\");
if (fileDlg.DoModal() == IDOK)
{
MessageBox(fileDlg.m_ofn.lpstrFile);;
}

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qリストコンロールの一行だけを太文字に(VC++)

http://oshiete.goo.ne.jp/qa/6729285.html で質問した者ですが、

DrawMenuBar();

を追加するだけで、メニューバーが通常表示されました。
コマンド名が全く分からずにすみません。

また、質問させていただきたいのですが、m_xcList という変数を割り当てたリストコンロール(IDC_LISTというID)のある特定の行だけを、太文字にしたいです。

( http://www.g-ishihara.com/mfc_lc_01.htm を参考にしました)

後は、 http://www5d.biglobe.ne.jp/~yasukiyo/vc.html に辿りついて、
「◇ リストボックス(CListBox)の項目(行)毎に色を変更する」 はできそうのですが、
色ではなく、「太文字」にしたいです。

なぜかというと、(既にできている エクセル版では、)リストをHTML形式で書き出し、太文字のアイテムを一つのフォルダに抽出するという仕様の為です。赤色にしたアイテムは別の意味を持っています。あまり、沢山の色を使いたくないです。

どのコマンドを使えばいいのでしょうか?そもそもできないのでしょうか。。。?
(もしできないのなら、なにか他のコントロールを使ったほうがいいですか?また、リストボックスとリストコントロールは別物ですか?)

今できそうなのは、さっきのホームページを参考にして、背景を黒に、文字を白にすることぐらいでしょうか?
でも、できればエクセル版と形式をそろえたいです。

(VC++2010, MFC, ダイアログベースのファイルリスト作成ソフトを(VBAより)移植中です。)

どうか、教えてください!

http://oshiete.goo.ne.jp/qa/6729285.html で質問した者ですが、

DrawMenuBar();

を追加するだけで、メニューバーが通常表示されました。
コマンド名が全く分からずにすみません。

また、質問させていただきたいのですが、m_xcList という変数を割り当てたリストコンロール(IDC_LISTというID)のある特定の行だけを、太文字にしたいです。

( http://www.g-ishihara.com/mfc_lc_01.htm を参考にしました)

後は、 http://www5d.biglobe.ne.jp/~yasukiyo/vc.html に辿りついて、
「◇ リストボックス(CListBox...続きを読む

Aベストアンサー

太字でない通常のフォントの場合指定するのはFW_NORMALですが、その場合はフォントを作成しなくても、元々選択されているフォントで描画すればいいはずです。定数については、LOGFONTの解説に書かれています。

http://msdn.microsoft.com/ja-jp/library/dd145037.aspx

アイテムが選択されているかどうかは、lpDrawItemStruct->itemActionにODA_SELECTが含まれているかを調べるようです。

if (lpDrawItemStruct->itemAction|ODA_SELECT) {
// 選択されている場合の描画
}
else {
// 選択されていない場合の描画
}

といった感じでしょうか。


人気Q&Aランキング