MFCのListCtrlを使ってセルに色をつけたい

このQ&Aのポイント
  • MFCのリストコントロールを使って、セルごとに色をつける方法について調べています。CMFCListCtrl::OnGetCellBkColorを使用すると可能なようですが、具体的な使い方がわかりません。
  • Clistctrol_colorDlg::OnInitDialog関数において、リストコントロールのカラムとデータ部を作成しているコードがあります。
  • 以下のURLには、MFCのリストコントロールに関する情報があります。
回答を見る
  • ベストアンサー

MFCのListCtrlを使ってセルに色をつけたい

はじめて質問させて頂きます。 よろしくお願い致します。 MFCのリストコントロールを使って、”セル”ごとに色をつけたいのですが、 可能でしょうか? 調べたところ、CMFCListCtrl::OnGetCellBkColorを使えば可能のようなのですが、 まったく使い方がわかりません。 できれば、下記のコードに添削頂ければ、ありがたいです。 どうぞよろしくお願い致します。 <コード> BOOL Clistctrol_colorDlg::OnInitDialog() {       ~略~ // TODO: 初期化をここに追加します。 //■カラム作成 char _ch00[10]="c1"; char _ch10[10]="c2"; LVCOLUMN lvc; lvc.mask=LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.iSubItem=0; lvc.pszText=_ch00; lvc.cx=100; m_wndList.InsertColumn(0, &lvc); lvc.iSubItem=1; lvc.pszText=_ch10; lvc.cx=100; m_wndList.InsertColumn(1, &lvc); //■データ部 char _ch0[10]="0"; char _ch1[10]="1"; char _ch2[10]="2"; char _ch3[10]="3"; LVITEM lvi; lvi.mask = LVIF_TEXT; lvi.iItem=0; lvi.iSubItem=0; lvi.pszText=_ch0; m_wndList.InsertItem(&lvi); lvi.iItem=0; lvi.iSubItem=1; lvi.pszText=_ch1; m_wndList.SetItem(&lvi); lvi.iItem=1; lvi.iSubItem=0; lvi.pszText=_ch2; m_wndList.InsertItem(&lvi); lvi.iItem=1; lvi.iSubItem=1; lvi.pszText=_ch3; m_wndList.SetItem(&lvi); return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 } <調べたURL> http://msdn.microsoft.com/ja-jp/library/bb984092.aspx http://www.orangemaker.sakura.ne.jp/labo/memo/sdk-mfc/CMFCListCtrl.html http://www.aspfree.com/c/a/.NET/List-Control-and-Property-Grid-with-the-MFC-Feature-Pack/

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

> 上記サンプルに添削いただくレベルでは、解決しないでしょうか? 提示部分には修正する場所はない。 > CMFCListCtrlを派生したクラスを作成し、そのクラスにOnGetCellBkColorを実装して、呼び出された引数(行、列)に応じたCOLOREF 値を返すようにする。 ----ColoredListControl.h(新規作成)---- #pragma once class CColoredListControl : public CMFCListCtrl { DECLARE_DYNAMIC(CColoredListControl) public: CColoredListControl(){} virtual ~CColoredListControl(){} virtual COLORREF OnGetCellBkColor(int row, int column) { // row, columnに応じた色を返すように変更! return RGB((row+2) * 64, (column+2) * 64, 128); } protected: DECLARE_MESSAGE_MAP() }; ----ColoredListControl.cpp(新規作成)---- #include "stdafx.h" #include "ColeredList.h" #include "ColeredListControl.h" // CColeredListControl IMPLEMENT_DYNAMIC(CColoredListControl, CMFCListCtrl) BEGIN_MESSAGE_MAP(CColoredListControl, CMFCListCtrl) END_MESSAGE_MAP() ----listctrol_colorDlg.h(Clistctrol_colorDlgの定義)---- CMFCListCtrl m_wndList; ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ CColoredListControl m_wndList; // 変更 ----listctrol_colorDlg.cpp(Clistctrol_colorDlgの実装)---- #include "ColoredListControl.h" // 追加

rechirin1
質問者

お礼

ご回答ありがとうございます。  今、いろいろとやっているのですが、なぜかうまくいきません。 もう少しやってみます。 本当にありがとうございます。

rechirin1
質問者

補足

できました!!! 本当に丁寧にありがとうございました!!

その他の回答 (1)

回答No.1

提示されているMSDNを見たところ、CMFCListCtrl::OnGetCellBkColorは、 「フレームワークは、個々のセルの背景色を確認する必要がある場合に、このメソッドを呼び出します。」 とあり、解説には 「OnGetCellBkColor の既定の実装は、指定された入力パラメーターを使用するのではなく、単に GetBkColor を呼び出します。 したがって、既定では、リスト コントロール全体に同じ背景色が設定されます。 個々のセルに個別の背景色を設定する場合は、派生クラスで OnGetCellBkColor をオーバーライドします。 」 と説明されています。 ポイントは、「個々のセルに個別の背景色を設定する場合は、派生クラスで OnGetCellBkColor をオーバーライドします。」です。 つまり、CMFCListCtrlを派生したクラスを作成し、そのクラスにOnGetCellBkColorを実装して、呼び出された引数(行、列)に応じたCOLOREF 値を返すようにする。 リストビューコントロールはCMFCListCtrlではなく、派生したクラスを対応させる。 自分ではやったことがないですけど、MSDNによれば、これで出来るはず。

rechirin1
質問者

お礼

ご回答ありがとうございます。 ですが申し訳ありません。 C++に詳しくなく派生クラスやオーバーライドがよくわかりません・・・ http://www.orangemaker.sakura.ne.jp/labo/memo/sdk-mfc/CMFCListCtrl.html http://www.aspfree.com/c/a/.NET/List-Control-and-Property-Grid-with-the-MFC-Feature-Pack/ で、おそらく派生クラス等がでているのですが、いったいDDX変数で設定した m_wndListにどのように関連付けるのかがさっぱりわかりません… 上記サンプルに添削いただくレベルでは、解決しないでしょうか?

関連するQ&A

  • リストコントロール(MFC or API)の最後尾にアイテムを追加するには?

     以下のような手順でリストコントロールにアイテムを追加しています。すると新しいアイテムはリストコントロールの先頭に追加されてしまいます。  先頭ではなくリストの最後尾にアイテムを挿入するにはどうしたらいいのでしょうか?  このサンプルはMFCですが回答はAPIやほかの手段を使っていても構いません。ヒントだけでも分かる方がいましたらお願いします。 LVITEM sItem; sItem.mask = LVIF_TEXT; sItem.iItem = 0; sItem.iSubItem = 0; sItem.pszText = LPSTR_TEXTCALLBACK; m_lpcList->InsertItem(&sItem);

  • 構造体を動的に確保&解放

    度々お世話になってます。 構造体を動的に確保し、処理後メモリーリークが起こらないように解放したいです。 item を m_xcList.GetItemCount() 個、宣言したいです。 ご教授願いたいです。 ▼ソースの一部抜粋▼ void CFileListCreatorDlg::SameItemCheck(CString mySwitch) {  LVITEM  lvi;  int   index = 0;  UpdateData();  lvi.mask = LVIF_TEXT;  CString FullPathString;  CString myFileName;  index = 0;  while (index < CFileListCreatorDlg::m_xcList.GetItemCount()){   lvi.iItem = index;   lvi.iSubItem = 0;      lvi.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(_T("")));   CFileListCreatorDlg::m_xcList.SetItem(&lvi);   index++;  }  //0:ファイル重複識別ナンバー 1:通し番号 2:フルパス 3:ファイル名 4:おおよそのデータサイズ 5:データサイズ 6:修正日 7:修正時間 8:備考欄 9:書式情報  //ファイル名、ファイル容量、修正日時により、重複チェック  struct item  {   CString RepetitionNum; //ファイル重複識別ナンバー   //int  Num;  //通し番号   CString FullPath; //ファイルパス   CString FileName; //ファイル名   //CString ApproximateByte; //おおよそのデータサイズ//バイト   CString AccurateByte;  //実際のデータサイズ//実バイト      //TCHAR ModifyDate[20];  //修正日   //CTime ModifyTime;  //修正時間      CString ModifyTime;  //修正時間      //TCHAR RemarksColumn[100];  //備考欄  };  //http://www-watt.mech.eng.osaka-u.ac.jp/~tasai/cp/lec1.html ← プログラム5を参考にしました。  struct item *array;  /* メモリの確保 */  array = (struct item*)malloc(sizeof(struct item)*(CFileListCreatorDlg::m_xcList.GetItemCount()-1));  if (array == NULL) {   StatusStringSet(_T("memory allocation error\r\n"),0,TRUE);   exit(EXIT_FAILURE);  }  //const int itemNum = sizeof item /sizeof array[0];  int i;  for (i = 0; i < CFileListCreatorDlg::m_xcList.GetItemCount(); i++) //初期化  {   array[i].RepetitionNum = _T(""); //ファイル重複識別ナンバー   array[i].FileName = _T(""); //ファイル名   array[i].AccurateByte = _T(""); //データサイズ   array[i].ModifyTime = _T(""); //修正時間  } int cc;  int dd;  cc = 1;  dd = 1;  if(mySwitch == _T("SameItemCheck_BY_FileName")){   //0:ファイル重複識別ナンバー 1:通し番号 2:フルパス 3:ファイル名 4:おおよそのデータサイズ 5:データサイズ 6:修正日 7:修正時間 8:備考欄 9:書式情報   StatusStringSet(_T("ファイル名により、重複チェック"),0,FALSE);   index = 0;   while (index < CFileListCreatorDlg::m_xcList.GetItemCount()){    array[index].RepetitionNum = _T("");    FullPathString = CFileListCreatorDlg::m_xcList.GetItemText(index,2);    if(FullPathString != _T("")){     array[index].FileName = FullPathToFileName(FullPathString);    }    for (dd = 0; dd <= index-1; dd++){     if (array[dd].FileName == array[index].FileName){      if (array[index].RepetitionNum != _T("")){       array[dd].RepetitionNum = array[index].RepetitionNum;       //" 重複番号欄に既に重複Noが、入っているとき"      }else{       //cc // " インクリメントcc"        CString str;        if (cc>=INT_MAX){         str = _T("MAX-Value");        }else{         str.Format(_T("%d"),cc);        }        array[index].RepetitionNum = const_cast<LPTSTR>(static_cast<LPCTSTR>(str));        if (array[dd].RepetitionNum != array[index].RepetitionNum){         cc++;        }      }      lvi.iItem = index;      lvi.iSubItem = 0;         lvi.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(array[index].RepetitionNum));      CFileListCreatorDlg::m_xcList.SetItem(&lvi);      UpdateData(FALSE);            lvi.iItem = dd;      lvi.iSubItem = 0;         lvi.pszText = const_cast<LPTSTR>(static_cast<LPCTSTR>(array[index].RepetitionNum));      CFileListCreatorDlg::m_xcList.SetItem(&lvi);      UpdateData(FALSE);     }    }    index++;    UpdateData(FALSE);   }  }else if(mySwitch == _T("SameItemCheck_By_DataSize")){   //省略  } } ▲ソースの一部抜粋▲ コンパイルは通るのですが、実行時に↓のエラーがでます。 どこの部分ががおかしいのでしょうか??  ▼エラーメッセージ▼  FileListCreator.exe の 0x00f08ac1 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0xcdcdcdbd を読み込み中にアクセス違反が発生しました。  void Empty() throw()  {   CStringData* pOldData = GetData();   IAtlStringMgr* pStringMgr = pOldData->pStringMgr;   if( pOldData->nDataLength == 0 )   {    return;   }   if( pOldData->IsLocked() )   {    // Don't reallocate a locked buffer that's shrinking    SetLength( 0 );   }   else   {    pOldData->Release();    CStringData* pNewData = pStringMgr->GetNilString();    Attach( pNewData );   }  }  ▲エラーメッセージ▲ 汎用的なコードをお教え願いたいです。宜しくお願いします。

  • テキストファイルの各行の文字列を、コンボBoxに表示させたい

    テキストファイルの各行の文字列を、コンボBoxに表示させたい 現在VC++ MFCの勉強をしております。(MFCに拘ってはおりません) 下のテキストファイル"D:\data.txt" (Shift_JIS)から (内容) 田中さん 斉藤さん 吉田さん CFile の Read で一行ずつ読み込んで、CStringArrayを使って コンボBox に Insert したいと思っています。 下記のコードについてですが。 BOOL CAddDialog::OnInitDialog() { CDialog::OnInitDialog(); // TODO: ここに初期化を追加してください TCHAR* pszFileName = L"d:\\data.txt"; CFileException fileException; CFile cFile; int ret; char buffLine[256] ; CStringArray cStrComboArr ; // リスト ret = cFile.Open( pszFileName , CFile::modeRead | CFile::shareDenyNone , &fileException ); if ( ret == false ) { AfxMessageBox( L"ファイルが読込めません。" ); return 1; } while ( (ret = cFile.Read( &buffLine , 256 )) != 0 ) { cStrComboArr.Add( buffLine ); /* ここでビルドエラー */ } cFile.Close(); // コンボboxに入れる CComboBoxEx* pCombo = (CComboBoxEx*) GetDlgItem( IDC_COMBOBOXEX1 ); COMBOBOXEXITEM cbi ; cbi.mask = CBEIF_TEXT; for ( int i = 0; i < cStrComboArr.GetCount(); i++ ) { cbi.iItem = i; cbi.pszText = (LPTSTR)(LPCTSTR) cStrComboArr.ElementAt(i) ; // 「'CString' から 'LPWSTR' に変換できません」から。 cbi.cchTextMax = 256; pCombo->InsertItem( &cbi ); } return TRUE; // return TRUE unless you set the focus to a control // 例外 : OCX プロパティ ページは必ず FALSE を返します。 } cStrComboArr.Add( buffLine ); の部分でエラー表示は、 「INT_PTR CStringArray::Add(LPCTSTR)' : 1 番目の引数を 'char [256]' から 'LPCTSTR' に変換できません。」です。 根本的にやり方が間違っているのか、もう少しのところなのか、 ズバッとご指摘いただけないでしょうか。 宜しくお願いします。 OS : Vista Home Premium VS 2008 pro

  • VB6 API LISTVIEW(チェックボックス付き)にチェックを付けたい

    CreateWindowExでLISTVIEW(チェックボックス付きのレポートビュー)を作ったのですが、「山田花子」行にソースでチェックを付ける方法が分かりません。 Form1のソース ↓ Option Explicit Private Sub Form_Load() Dim lngRet As Long Dim lvcol As LV_COLUMN Dim rStyle As Long Dim item As LV_ITEM '-- リストビューの作成 hList = CreateWindowEx(WS_EX_CLIENTEDGE, _ WC_LISTVIEW, "", _ WS_CHILD Or WS_VISIBLE Or WS_BORDER Or _ WS_CLIPSIBLINGS Or WS_CLIPCHILDREN Or _ LVS_REPORT, _ 0&, 0&, Me.ScaleWidth / Screen.TwipsPerPixelX, 200&, _ Me.hwnd, _ 0&, _ App.HINSTANCE, _ ByVal 0&) '拡張スタイルを設定 rStyle = rStyle Or LVS_EX_FULLROWSELECT Or LVS_EX_GRIDLINES Or LVS_EX_CHECKBOXES SendMessageByNum hList, LVM_SETEXTENDEDLISTVIEWSTYLE, 0&, rStyle '-- カラムヘッダーの追加 With lvcol .mask = LVCF_FMT Or LVCF_WIDTH Or LVCF_TEXT Or LVCF_SUBITEM .fmt = LVCFMT_LEFT .cx = 100 .pszText = "名前" .iSubItem = 0 lngRet = ListView_InsertColumn(hList, 0&, lvcol) End With '-- リストアイテムの追加 With item .mask = LVIF_TEXT Or LVIF_IMAGE ' 1つめ .pszText = "山田 太郎" .iItem = 0 .iSubItem = 0 .iImage = 0 lngRet = ListView_InsertItem(hList, item) ' 2つめ .pszText = "山田 花子" .iItem = 1 .iSubItem = 0 .iImage = 1 lngRet = ListView_InsertItem(hList, item) End With End Sub Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer) '-- リストビューを破棄 DestroyWindow hList End Sub 標準モジュールは補足に書きます

  • ツリービューで、起動時にチェックを入れたい

    またまた教えてください。 mfcのツリービューにて、チェックボックスを設け、 起動時にチェックを入れたいのですが、チェックが入りません。 BOOL CtreeTestDlg::OnInitDialog() { CDialogEx::OnInitDialog(); … // TODO: 初期化をここに追加します。 HTREEITEM h1 = m_tree.InsertItem(_T("TEST"), TVI_ROOT); m_tree.SetCheck(h1); return TRUE; // フォーカスをコントロールに設定した場合を除き、TRUE を返します。 } ボタンクリック時では問題がありません。 UpdateData等も入れたりしたのですが、ダメでした。 vs2010,2013両方でダメです。 なにかよい方法がないでしょうか? よろしくお願い致します。

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

    お世話になります、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 です。 ご回答をお待ちしております。

  • LV_ITEM構造体のメンバlParamについて

    リストビューのカラムをクリックすると、落ちてしまいます。 やりたい事は、カラムをクリックするとソートするようにしたいです。 下記の(8)でLV_ITEM構造体のポインタを取得した時に メンバlParamの値は空のまま(0)の為? 落ちてしまうのです。 どのようにしたら、値を取得できるのでしょうか?? 一部ですが、問題のあるところだけ下記に明記します。 #説明上、番号を振りました。 #下記の処理は、CListCtrlクラスを継承したCxxxxクラスの関数です。 ************(ここから)****************** (1)LV_ITEM lvItem; (2)int iTemNo; (3)for(int i = 0; i < this->GetItemCount(); i++) (4){ (5) lvItem.iItem = i; (6) lvItem.iSubItem = 0; (7) lvItem.mask = LVIF_PARAM; (8) this->GetItem(&lvItem); (9) LPITEMPARAM lpItemParam = (LPITEMPARAM)lvItem.lParam; (10) iTemNo = i; (11) this->SetItem(&lvItem); (12)} ************(ここまで)****************** 環境は、Win98、MFCで作成しています。 (8)ではGetItemの戻り値で確認したら、 正常に構造体を取得できているかと思うのですが、 lParamの値は、空なんです・・・・。 また、他に必要な情報は、ございますでしょうか? よろしくお願いします。

  • get()を否定されました…どのように直せばいいでしょうか…

    プログラムで、文中のpikatyuという文字をraityuに変換させるプログラムを作れという問題で、以下のプログラムを作成しました。 すると、警告文で prog.c: In function 'main': prog.c:14: warning: unused variable 'c' prog.c:33: warning: control reaches end of non-void function /var/tmp//cc1HByZn.o(.text+0x51):Infunction 'main': : warning: warning: this program uses gets(), which is unsafe. というものが出てきました。 コンパイルはできるのですが、 講師がgets()を使うなと言うのです。 どのようにすれば認めてもらえるのでしょうか? どこをどのように直せばいいか教えてください。お願いします。 #include<stdio.h> #include<string.h> #define SIZE 512 char *search(char *,char *); void replacce(char *,char *,char *); int main(int argc,char, **argv) { char c; int i = 0, j = 0; char a[SIZE][SIZE]; for (i = 0; i < SIZE; i++) { gets(a[i]); } while(a[j][0] != '\0') { replace(a[j],"pikatyu","raityu"); printf("%s\n", a[j]); j++; } } void replace(char *text, char *key, char *rep) { char *p,buf[SIZE]; p = search(text, key); while(p != NULL) { *p ='\0'; strcpy(buf, p + strlen(key)); strcat(text, rep); strcat(text, buf); p = search (p + strlen(rep), key); } } char *search(char *text, char *key) { int m, n; char *p; m = strlen(text); n = strlen(key); for(p = text; p <= text + m - n; p++) { if(strncmp(p, key, n) == 0) return (p); } return (NULL); }

  • CTabCtrl:TABインデックス単位のEnableWindow(false)について

    TABインデックス単位でEnableWindow(false)を行うとTABに置いたコントールすべてが入力不可(VBでいうとLOCK(TRUE))となりますが非活性になりません。 さらに、TAB自体選択可能です。 VBではTABインデックス単位で非活性・選択不可にできるのですが、VC++では無理なのでしょうか? -環境- ・VC++ 6.0 ・MFC ・ダイアログベース -参考- TC_ITEM item; ::memset(&item, 0, sizeof(TC_ITEM)); item.mask = TCIF_TEXT; item.pszText = "XXX"; m_Tab.InsertItem(0, &item); m_OptionTab1.Create(IDD_OPTION_TAB1, &m_Tab);   ある条件で m_OptionTab1.EnableWindow(false);

  • ? ←これってどうゆう意味ですか?C++MFCです。

    C++のMFCにてカスタムコントロールを作ろうとして いろいろサイトを調べ、コピペで何とか作れたのですが、どうやってるのかよくわからないんです。 特に「?」これ。 void CCstBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CBrush br((lpDrawItemStruct- >itemState&ODS_SELECTED) ? (m_color ? ((m_color&0xfefefe)>>1) : 0x303030) : m_color); FillRect(lpDrawItemStruct->hDC,&lpDrawItemStruct->rcItem,(HBRUSH)br); } ってゆうか、うまくコードが載りませんね? これもなんとかならないんですかね? 話を戻します。 「?」今までのコードではみたことなくて、調べてみてたんですが、検索エンジンで入力すると消えるんですよね。これは困った。 どうゆう意味? ご教授お願いします。 また良いサイトありましたら教えてください。 お願いします。

専門家に質問してみよう