1
我已经设计了一些标志:解码标志不能正常工作
enum ImportAssignment
{
OCLMChairman = 0x00000001,
OCLMOpenPrayer = 0x00000002,
OCLMClosePrayer = 0x00000004,
OCLMConductorCBS = 0x00000008,
OCLMReaderCBS = 0x00000016,
PTChairman = 0x00000032,
PTHospitality = 0x00000064,
WTConductor = 0x00000128,
WTReader = 0x00000256
};
在我的对话我读/写的标志从/到注册表:
void CImportOCLMAssignmentHistoryDlg::ReadSettings()
{
m_dwImportFlags = theApp.GetNumberSetting(theApp.GetActiveScheduleSection(_T("Options")), _T("ImportFlags"), 0);
}
void CImportOCLMAssignmentHistoryDlg::SaveSettings()
{
theApp.SetNumberSetting(theApp.GetActiveScheduleSection(_T("Options")), _T("ImportFlags"), m_dwImportFlags);
}
SetNumberSetting
基本上是一个包装GetProfileInt
等。
然后我有两种方法可以将标志编码和解码为一系列BOOL变量(复选框):
void CImportOCLMAssignmentHistoryDlg::DecodeImportFlags()
{
m_bImportOCLMChairman = (m_dwImportFlags & ImportAssignment::OCLMChairman);
m_bImportOCLMOpenPrayer = (m_dwImportFlags & ImportAssignment::OCLMOpenPrayer);
m_bImportOCLMClosePrayer = (m_dwImportFlags & ImportAssignment::OCLMClosePrayer);
m_bImportOCLMConductorCBS = (m_dwImportFlags & ImportAssignment::OCLMConductorCBS);
m_bImportOCLMReaderCBS = (m_dwImportFlags & ImportAssignment::OCLMReaderCBS);
m_bImportPTChairman = (m_dwImportFlags & ImportAssignment::PTChairman);
m_bImportPTHospitality = (m_dwImportFlags & ImportAssignment::PTHospitality);
m_bImportWTConductor = (m_dwImportFlags & ImportAssignment::WTConductor);
m_bImportWTReader = (m_dwImportFlags & ImportAssignment::WTReader);
}
void CImportOCLMAssignmentHistoryDlg::EncodeImportFlags()
{
m_dwImportFlags = 0; // Reset
if (m_bImportOCLMChairman) m_dwImportFlags |= ImportAssignment::OCLMChairman;
if (m_bImportOCLMOpenPrayer) m_dwImportFlags |= ImportAssignment::OCLMOpenPrayer;
if (m_bImportOCLMClosePrayer) m_dwImportFlags |= ImportAssignment::OCLMClosePrayer;
if (m_bImportOCLMConductorCBS) m_dwImportFlags |= ImportAssignment::OCLMConductorCBS;
if (m_bImportOCLMReaderCBS) m_dwImportFlags |= ImportAssignment::OCLMReaderCBS;
if (m_bImportPTChairman) m_dwImportFlags |= ImportAssignment::PTChairman;
if (m_bImportPTHospitality) m_dwImportFlags |= ImportAssignment::PTHospitality;
if (m_bImportWTConductor) m_dwImportFlags |= ImportAssignment::WTConductor;
if (m_bImportWTReader) m_dwImportFlags |= ImportAssignment::WTReader;
}
当我第一次运行该应用程序时,复选框未被选中。然后我打勾一对夫妇。我关闭对话框并重新打开它。总是前两个被打勾。
我支持64x和32x构建。
我在做什么错?
你'ImportAssignment'标志是错误的,从第一个两位数的值。这些应该是'0x10','0x20','0x40','0x80','0x100'。我总是在* Programmer *模式中抽出Windows'* calc.exe *来仔细检查。每个值都应该设置一个位,并清除所有其他位(例如,'0x16'[即十进制22]为二进制的“10110”)。 – IInspectable
@IInspectable感谢您的澄清。我更新了我现在如何定义标志的答案。 –