我想更改该控件的 EN_SETFOCUS 中的编辑控件(即常规编辑窗口类)的背景颜色。我知道我应该处理 WM_CTLCOLOR,在我得到的 DC 上执行 SetBkColor(),并返回带有背景颜色的画笔的句柄。但是,当我从 EN_SETFOCUS 执行此操作时,我的控件不会正确失效或重绘。基本上我的文本周围有一个颜色错误的 1 像素边框;因此黑色边框内的矩形已经位于控件本身周围。如果我将鼠标光标移到控件上,错误边框的某些部分会正确重绘,有时整个工件会在一小段时间后消失,就好像某个计时器导致完全重绘一样。
我尝试过在各个地方使控件无效,例如 DC 上的 RedrawWindow、SelectRgn(NULL)、使用对话框的 wS_CLIPCHILDREN 和 -SIBLINGS、使控件所在的矩形上的对话框无效,但这些都不起作用。我还在 2001 年的一篇帖子中发现了对类似问题的模糊引用(!),但没有解决方案。有人遇到过这种情况吗?关于我可以尝试的其他事情有什么想法吗?
FWIW,这是在WinXP上使用VS9,并使用MFC,但我也“手动”发送消息,这没有改变任何东西,我不认为MFC在这种情况下是罪魁祸首。当然我可能是错的:)
编辑:
下面的屏幕截图对话框的代码(最小示例)位于: http: //pastebin.com/zepdhdp5。这是一个由向导生成的小型应用程序 - 没什么特别的,完整的源代码可以从https://www.dropbox.com/s/d8nxaryoo0vclue/edit_control_redrawing_sample.zip下载。
控件获得焦点后如下所示:

当它失去焦点时就像这样:

正如您所看到的,文本区域周围似乎有一个不会失效的边框。
我尝试用纯 win32 重现此问题,但是当我不使用 commonctrl6 时,它不会出现问题。不过,我无法让 commonctrl6 在 win32 中工作,所以我现在怀疑它与此有关。
我正在寻找一种在图书馆中嵌入图像的方法(仅限Windows).我不想采用"传统"方式将其放入资源中(因为特殊情况使得处理资源句柄变得不那么方便).
理想情况下,会有类似xpm文件的东西:放在交流数组中的图像的"文本"表示,并且某些代码会转换为内存中的位图,然后可以某种方式将其加载到HIMAGE或HICON中.我想嵌入的图像是32位位图(bmp).有任何想法吗?我正在使用MFC,因此MFC库可以,但我当然可以使用不使用MFC的库.谢谢.
我最近完成了第一个专用编程语言的解析器/编译器。我对这种语言的规范有一定的自由度,并且在某些地方我调整了规范以使其更易于解析;在某些地方,这导致了语言本身的一些(到目前为止)小问题的改进。也许我会在未来的 v2 中修复这些问题;目前我仍在消化从这个过程中学到的东西,对此我有几个问题。我从未参加过有关编译器设计的正式课程,因此我想验证我的理解是否符合该领域的最新技术。
大多数文章和教科书将解析过程分为两个阶段:标记化和词法分析。然后通常会提到,在大多数现实世界的实现中,两者通常有些交织在一起,以使实现更容易。我自己的经验恰恰相反,混合它们会使事情变得更困难,我什至添加了第三遍。我进行了第一遍,其中进行了简约的标记化,这意味着我以最简单的形式定义“标记”。例如,我尝试了一些方法,其中构造函数作为一个整体是一个“令牌”。我放弃了这种方法,现在只将程序最基本的构建块称为“令牌”。然后我进行词法分析,构建 AST。然后我的第三遍是(我所说的)结构分析,其中我进行类型检查,检查传递给函数的参数数量是否与这些函数的签名匹配等。这通常不是“解析”的一部分,或被置于“词法分析”之下,或者为什么文献大多提出两遍解析方法?(可以说我有第四遍,代码生成,但这很大程度上是一个单独的过程)。
我的词法分析器(我认为)是递归下降的 - 我有匹配令牌流或在无法匹配时返回 false 的例程,然后尝试匹配另一个“规则”,一直到处理所有令牌为止。这些例程最多向前查看 2 个标记;据我了解,这意味着我有“LL(2) 语法”。我的问题是:这个数字有什么关系?“LL(1) 语法”是否比那些数字更高的语法“更好”?另外,为什么回溯是不可取的?(或者不是,我只是误会了吗?)
为什么语法的分类如此重要?所有文本都以(通常相当广泛的)解释开始,但据我了解,如果不更改您正在设计的语言的工作方式,您就无法真正更改语法的属性。现在我明白了,如果你想解析一种现有的语言,对其结构进行分类将使你能够证明生成的解析器的复杂性类别;但是在设计一种新语言时,(我认为)最重要的是表达能力或其他适合当前目的的能力,而解析器的性能是次要的。虽然我意识到最后一部分是有争议的,但在设计新语言时,是否有实际原因需要仔细观察语法类型?
考虑:
#include <iostream>
#include <vector>
class A
{
public:
typedef bool TAll;
static TAll All;
typedef std::vector<int> TVec;
static TVec m_sVec;
static TVec::iterator begin() { return m_sVec.begin(); }
static TVec::iterator end() { return m_sVec.end(); }
};
A::TVec A::m_sVec;
A::TAll A::All;
A::TVec::iterator begin(A::TAll& all) { return A::begin(); }
A::TVec::iterator end(A::TAll& all) { return A::end(); }
int _tmain(int argc, _TCHAR* argv[])
{
A::m_sVec.push_back(1);
A::m_sVec.push_back(2);
A::m_sVec.push_back(3);
for (auto a : A::All) {
//for (auto a = begin(A::All); a != end(A::All); a++) {
std::cout …Run Code Online (Sandbox Code Playgroud) 我正在玩一个应用程序,粗略地说,这是一种建筑行业的建模应用程序.将来我希望用户可以同时使用SI单位和英制单位.根据我的理解,美国建筑行业习惯于在指定测量时使用几分之一英寸,例如3 1/2英寸 - 而在SI中我们写3.5,而不是3 1/2.我正在寻找一种方法在我的软件中使用这些不同的系统 - 存储它们,对它们进行计算等,不仅解析用户输入的内容.它应该能够以他输入的方式向用户显示测量值,同时能够用其他测量 - 例如增加3厘米到1 1/2英寸.因此,如果用户绘制5英尺长的墙和3米的另一个墙,则应在用户选择的默认单位系统中显示总测量值.
我还没有确定应该为用户输入数据添加多少灵活性; 例如,如果他进入1英尺14英寸,那么下次显示测量值时应该是2英尺2英寸吗?然而,在我决定这样的事情之前,我正在寻找一种以精确的形式存储测量值的方法,这就是我的问题所在.
我正在使用C++,我看过Boost.Units,但这似乎没有提供处理分数的方法.
简单的选择是将所有内容转换为毫米,但舍入错误将导致无法返回到用户输入的精确测量值(如果他在英制测量中输入).所以我需要更复杂的东西.
现在我正在使用一个暂定名为"距离"的类,看起来在概念上如下:
class Distance
{
public:
Distance(double value);
// operators +, -, *, /
Distance operator+(const Distance& that);
...etc...
std::string StringForm(); // Returns a textual form of the value
Distance operator=(double value);
private:
<question: what should go here?>
}
Run Code Online (Sandbox Code Playgroud)
这清楚地表明了我的问题所在.最明显的事情是有一个枚举,说明这个距离是存储SI还是英制单位,并且有字段(可能是双倍)存储米,厘米和毫米(如果它是以SI为单位,英尺和英寸)这是帝国的.然而,这将使该类的实现乱丢if(SI)else ...,并且在内存中非常浪费.另外,我必须为脚和英寸存储分子和分母,以便能够精确地存储1/3",例如.
因此,根据我的设计要求,我正在寻找关于如何解决这些问题的一般设计建议.当然,如果有一个已经完成这些事情的C++库,或者我可以看到另一种语言的库来复制概念,那就太好了.
所以我有一些代码基本上可以做到这一点:
REAL, DIMENSION(31) :: month_data
INTEGER :: no_days
no_days = get_no_days()
month_data = [fill array with some values]
WRITE(1000,*) (month_data(d), d=1,no_days)
Run Code Online (Sandbox Code Playgroud)
因此,我有一个包含每个月值的数组,在循环中,我根据该月有多少天用一定数量的值填充该数组,然后将结果写入文件中。
我花了相当长的时间才理解 WRITE 的整个“一次性写出一个数组”方面,但这似乎有效。
然而,这样,它会像这样写出数组中的数字(例如 1 月,因此有 31 个值):
0.00000 10.0000 20.0000 30.0000 40.0000 50.0000 60.0000
70.0000 80.0000 90.0000 100.000 110.000 120.000 130.000
140.000 150.000 160.000 170.000 180.000 190.000 200.000
210.000 220.000 230.000 240.000 250.000 260.000 270.000
280.000 290.000 300.000
Run Code Online (Sandbox Code Playgroud)
因此它会添加很多空格作为前缀(大概是为了让列对齐,即使数组中存在较大的值),并且它会换行以使其不超过一定的宽度(我认为是 128 个字符?不确定)。
我真的不介意额外的空格(尽管它们大大增加了我的文件大小,所以解决这个问题也很好......)但是分解线搞砸了我的其他工具。我尝试阅读几本 Fortran 手册,但虽然其中一些提到了“输出格式”,但我还没有找到一本提到换行符或列的手册。
那么,在 Fortran 中使用上述语法时如何控制数组的写出方式呢?
(另外,当我们这样做时,如何控制小数位数?我知道这些都是整数值,所以我想一起省略任何小数,但我无法将数据类型更改为由于某些原因,我的代码中出现了 INTEGER)。