hur.cn - 华软网

 热门搜索

(附完整源代码)设置了列表控件的背景为透明及风格后,为何列表的第1列会变成黑色???

  作者:未知    来源:网络    更新时间:2009/9/27




这个项目只加了一个列表控件,然后设置了背景和文本背景均为透明,其余再没有增加所有无关代码
总有人说下面的代码没啥问题,不会出现此问题,可是我照旧希望若有此念头,最自己去尝试一下.
C++">
// ------------------------------- DemoDlg.h : 对话框类头资料 -------------------------------
// DemoDlg.h : 头资料
//
#pragma once

// CDemoDlg 对话框
class CDemoDlg : public CDialog
{
// 构造
public:
    CDemoDlg(CWnd* pParent = NULL);    // 规范构造函数

// 对话框数据
    enum { IDD = IDD_DEMO_DIALOG };

    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
    HICON m_hIcon;

    // 生成的消息映照函数
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()

public:
    CListCtrl m_CListCtrl;
};



C++">
// ------------------------------- DemoDlg.cpp : 实现资料 -------------------------------
// DemoDlg.cpp : 实现资料
//
#include "stdafx.h"
#include "Demo.h"
#include "DemoDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CDemoDlg 对话框

CDemoDlg::CDemoDlg(CWnd* pParent /*=NULL*/)
    : CDialog(CDemoDlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CDemoDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);

    DDX_Control(pDX, IDC_LIST, m_CListCtrl);
}

BEGIN_MESSAGE_MAP(CDemoDlg, CDialog)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()


// CDemoDlg 消息措置惩罚程序
BOOL CDemoDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此增加额外的初始化代码

    m_CListCtrl.SetBkColor(CLR_NONE);//问题就出在这里,除非把下面的SetExtendedStyle()方法去掉,否则就会变黑色
    m_CListCtrl.SetTextBkColor(CLR_NONE);

    // 设置列表控件的气概
    m_CListCtrl.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);

    m_CListCtrl.InsertColumn(1, _T("日期"), LVCFMT_CENTER, 75);
    m_CListCtrl.InsertColumn(1, _T("星期"), LVCFMT_CENTER, 60);
    m_CListCtrl.InsertColumn(2, _T("中午(份)"), LVCFMT_CENTER, 70);
    m_CListCtrl.InsertColumn(3, _T("晚上(份)"), LVCFMT_CENTER, 70);

    m_CListCtrl.InsertItem(0, _T(""));
    m_CListCtrl.SetItemText(0, 0, _T("黑龙江"));

    m_CListCtrl.InsertItem(1, _T(""));
    m_CListCtrl.SetItemText(1, 0, _T("吉林"));

    m_CListCtrl.InsertItem(2, _T(""));
    m_CListCtrl.SetItemText(2, 0, _T("辽宁"));

    return TRUE;  // 除非将焦点设置到控件,否则前往 TRUE
}

// 如果向对话框增加最小化按钮,则需要下面的代码
//  来绘制该图标。对于运用文档/视图模子的 MFC 应用程序,
//  这将由框架自动完成。

void CDemoDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // 使图标在事情区矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CDemoDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}


---华软 网友回答---
是否是有选中的列造成
---华软网友回复---
引用 1 楼 jyh_baoding 的回复:
是否是有选中的列造成


我都说了,你看看代码,我那里写了所有武官的代码??
我不写代码,他会自己自动选中某一列么??
---华软网友回复---
我看这条语句设置文本背景致,可能不能这样写
m_CListCtrl.SetTextBkColor(CLR_NONE);

---华软网友回复---
我在VISTA上尝试了,没问题
不行的话你换台VISTA的机器尝试看看
---华软网友回复---
引用 4 楼 zoulie 的回复:
我在VISTA上尝试了,没问题
不行的话你换台VISTA的机器尝试看看


晕了,我的XP系统应该不会有问题,难道是我的vs2008有问题????
---华软网友回复---
换个编译器试试看吧。
---华软网友回复---
我刚刚也尝试过了,没问题....
LZ的RP莫非...
---华软网友回复---
引用 7 楼 tr0j4n 的回复:
我刚刚也尝试过了,没问题....
LZ的RP莫非...


请问你用的是什么编译器啊????不是VS2008吗??我的VS2008还打了SP1补钉的
---华软网友回复---
   是在现了 我预计是SetExtendedStyle把原来的颜色给轻忽掉了,酿成了运用黑色,再查查看
    有个问题我很猎奇的,去掉SetExtendedStyle,楼主insert的时候m_CListCtrl.InsertColumn(1, _T("日期"), LVCFMT_CENTER, 75),用的是LVCFMT_CENTER,为什么点一下某个,就酿成left了呢?

---华软网友回复---
   我那个猎奇的问题大概知道了,是楼主写错了
   m_CListCtrl.InsertColumn(1, _T("日期"), LVCFMT_CENTER, 75);
   m_CListCtrl.InsertColumn(1, _T("星期"), LVCFMT_CENTER, 60);
   2个都是1

   
---华软网友回复---
    SetExtendedStyle 调用完后 预计会把CLR_NONE当做0x00ffffff看待了,所以是黑色..换成其余所有颜色都没什么问题
---华软网友回复---
    m_CListCtrl.SetBkColor(CLR_NONE);//问题就出在这里,除非把下面的SetExtendedStyle()方法去掉,否则就会变黑色
    m_CListCtrl.SetTextBkColor(CLR_NONE);
我也遇到了,我发现在有XP气概的情况下,设置为TRANSPANT如果背景刷前往NULL_BRUSH界面就会变黑
预计你的前面SetBkColor就起到了前往NULL_BRUSH的作用,你追踪一下。
---华软网友回复---
找到原因了,你的代码如果设置XP气概的话就会变黑。
---华软网友回复---
引用 13 楼 gotooker 的回复:
找到原因了,你的代码如果设置XP气概的话就会变黑。


谢谢你的指点,请问,你有解决的措施吗,究竟大部份人用的电脑都是XP哪。。。
---华软网友回复---
引用 13 楼 gotooker 的回复:
找到原因了,你的代码如果设置XP气概的话就会变黑。


谢谢你的指点,请问,你有解决的措施吗,究竟大部份人用的电脑都是XP哪。。。
---华软网友回复---
我是初学者,我自己觉得好像是rcbkcolor 没有初始化吧?不知道对不对
---华软网友回复---
错了错了,就当我乱说八道吧,大家无视      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。